我正在做一个玩具服务器 - 客户端项目(在linux上),其中多个客户端连接到服务器并在服务器上执行远程执行。我所拥有的是一个select()调用,它应该告诉我套接字何时可读。这适用于侦听和接受新连接。下面我发布了一个片段。
int main() {
int sockfd;
fd_set readfds;
struct sockaddr_in serv_addr,cli_addr;
struct timeval tv;
socklen_t clilen = sizeof(cli_addr);
sockfd=socket(AF_INET, SOCK_STREAM, 0);
//setsockopt(sockid,IPPROTO_IPV6,IPV6_V6ONLY,(char *)&yes,sizeof(yes));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr =inet_addr("127.0.0.1");// INADDR_ANY;
serv_addr.sin_port = htons(40000);
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
perror("bind");
}
while(1)
{
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
tv.tv_sec=2;
tv.tv_usec=500000;
int result =select(sockfd+1,&readfds,NULL,NULL,&tv);
if(result<0) {
exit(-1);
}
else if(result>0) {
if(FD_ISSET(sockfd,&readfds)) {
//int newsockfd =accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
int newsockfd =accept(sockfd,NULL,NULL);
if(newsockfd<0) {
perror("accept");
}
}
}
}
return 0;
}
但是无论是否存在任何客户端,上面代码中的select总是成功的,并且accept抛出错误: &#34;接受:无效的参数&#34; 并继续循环,select甚至不等待超时。有人可以解释我的代码有什么问题。我没有使用选择正确使用它的方式(我是第一次使用它)?
答案 0 :(得分:3)
您忘记在listen
之后致电bind
。