日期:2014-05-16  浏览次数:20795 次

socket的select使用超时的问题
一段udp客户端程序,c写的,在windows下没问题,在linux下时,在发送数据等待回应时,用select就会超时,去掉select能够正常读数,这是什么原因?

调用select的函数:
int is_readible(int * bReadible)
{
struct timeval timeout;
fd_set fds;
int nStatus;

timeout.tv_sec=10;
timeout.tv_usec=10;
 
FD_ZERO(&fds);
FD_SET(m_hNtpClientSocket, &fds);
nStatus = select(0, &fds, NULL, NULL, &timeout);
printf("nStatus = %d \n",nStatus);
if (nStatus == -1)

return SD_FALSE;
}
else
{
*bReadible = !(nStatus == 0);
return SD_TRUE;
}
}

------解决方案--------------------
nStatus = select(0, &fds, NULL, NULL, &timeout);

用错列。。。


select 的第一个参数必须是 m_hNtpClientSocket + 1
------解决方案--------------------
楼上是正解,select函数第一个参数是fd_set的max值,一般都是取最大的fd并且+1
------解决方案--------------------
探讨

nStatus = select(0, &fds, NULL, NULL, &timeout);

用错列。。。


select 的第一个参数必须是 m_hNtpClientSocket + 1