我目前正在从事一个项目,该项目涉及连接到服务器并等待数据的多个客户端。我正在使用选择并监视传入数据的连接。但是,客户端只是继续不打印任何内容,就好像 select 已经发现传入数据一样。也许我攻击这个错误?
对于服务器发送的第一条数据,它是正确显示的。然而,服务器随后断开连接,客户端继续输出空行。
FD_ZERO(&readnet);
FD_SET(sockfd, &readnet);
while(1){
rv = select(socketdescrip, &readnet, NULL, NULL, &timeout);
if (rv == -1) {
perror("select"); // error occurred in select()
} else if (rv == 0) {
printf("Connection timeout! No data after 10 seconds.\n");
} else {
// one or both of the descriptors have data
if (FD_ISSET(sockfd, &readnet)) {
numbytes = recv(sockfd, buf, sizeof buf, 0);
printf("Data Received\n");
buf[numbytes] = '\0';
printf("client: received '%s'\n",buf);
sleep(10);
}
}
}
最佳答案
我认为您需要检查 recv
的结果.如果它返回零,我相信这意味着服务器已关闭套接字。
此外(取决于实现),您可能需要将 socketdescrip+1
传递给 select
。
关于c - 通过选择等待数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2992547/