socket编程,为了实现非阻塞而使用select函数。原代码在Windows下运行正常,移植到linux下之后超时功能失效,select并未等待timeout参数中设置的超时时间,直接返回 0。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
struct timeval timeout = { 3, 0};
while (true)
{
timeout = { 3, 0};
FD_ZERO(&fd);
FD_SET(rServerSocket, &fd);
if (select(ServerSocket + 1, &fd, NULL, NULL, &timeout) > 0)
{
...
}
else
{
...
}
}
问题原因:linux下select函数每次执行完成后会将timeout参数清空,所以在while循环里每次给timeout变量重新赋值就正常了。也就是说select仅在第一次执行时有等待操作。
发表评论