現在、 winsock を使用してサーバーを構築しています。私のサーバーは複数のクライアントを扱うので、select() 関数と読み取り、書き込み、および例外セットを使用しています。特定のソケットがタイムアウトした場合、 select() が 0 を返すことは既に知っています。
しかし、タイムアウトになった実際のソケットを特定するにはどうすればよいでしょうか?
ところで、FD_ISSET(Some_Socket, &Exception) が true を返すために Some_Socket に何が起こる必要があるか教えてもらえますか?
上記の関数を使用して、セット内のすべてのソケットをチェックできますか?
編集:
この例があるとしましょう:
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);
}
タイムアウトになったソケットを特定するにはどうすればよいですか?