【发布时间】:2012-12-31 23:38:09
【问题描述】:
我目前正在使用 winsock 构建服务器。我的服务器将处理多个客户端,所以我使用 select() 函数以及读、写和异常集。我已经知道如果一个特定的套接字超时, select() 返回 0 。
但是我如何识别实际超时的套接字呢?
顺便说一句,谁能告诉我 Some_Socket 需要做什么才能使 FD_ISSET(Some_Socket, &Exception) 返回 true?
也许我可以使用上面的函数来检查集合中的每个套接字?
编辑:
假设我有这个例子:
int main(void){
fd_set rfds;
struct timeval tv;
int retval;
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
for(int i = 0; i<clientcount; i++) {
FD_SET(sockets[i].Scksas, &read_mask);
FD_SET(sockets[i].Scksas, &write_mask);
FD_SET(sockets[i].Scksas, &excep_mask);
}
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else{
printf("No data within five seconds.\n");
/*
Handle timed out socket, but which one ?
*/
}
exit(EXIT_SUCCESS);
}
我应该如何确定哪个 soket 超时?
【问题讨论】:
-
在下面查看我的答案......简而言之,它们都超时了。也就是说,在您指定的时间内,它们中的任何一个都没有发生任何事情。如果在超时之前其中一个或多个发生了某些事情,那么它将退出选择并返回“有趣”事物的计数,然后您使用 FD_ISSET 遍历它们
标签: c++ windows sockets timeout winsock