我正在将一个Windows网络应用程序移植到Linux,但在Linux上使用select调用时遇到了超时问题。以下函数会阻塞整个超时时间,并返回,而我检查了数据包嗅探器后发现客户端已经发送了数据。
int recvTimeOutTCP( SOCKET socket, long sec, long usec )
{
struct timeval timeout;
fd_set fds;.
timeout.tv_sec = sec;
timeout.tv_usec = usec;
FD_ZERO( &fds );
FD_SET( socket, &fds );
// Possible return values:
// -1: error occurred
// 0: timed out
// > 0: data ready to be read
cerr << "Waiting on fd " << socket << endl;
return select(1, &fds, 0, 0, &timeout);
}
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
其中 nfds 是“三个集合中最高编号的文件描述符加1”。 - jamessanselect()
文档中明确说明了:http://msdn.microsoft.com/en-us/library/ms740141%28VS.85%29.aspx - mskfisher