我目前正在使用 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 超时?