一個seclect的封裝
uint32 SocketWait(TSocket *s,bool rd,bool wr,uint32 timems)
{
fd_set rfds,wfds;
#ifdef _WIN32
TIMEVAL tv;
#else
struct timeval tv;
#endif /* _WIN32 */
FD_ZERO(&rfds);
FD_ZERO(&wfds);
if (rd) //TRUE
FD_SET(*s,&rfds); //添加要測試的描述字
if (wr) //FALSE
FD_SET(*s,&wfds);
tv.tv_sec=timems/1000; //second
tv.tv_usec=timems%1000; //ms
for (;;) //如果errno==EINTR,反復測試緩沖區的可讀性
{
switch(select((*s)+1,&rfds,&wfds,NULL,
(timems==TIME_INFINITE?NULL:&tv))) //測試在規定的時間內套接口接收緩沖區中是否有數據可讀
{ //0--超時,-1--出錯
case 0: /* time out */
return 0;
case (-1): /* socket error */
if (SocketError()==EINTR)
break;
return 0; //有錯但不是EINTR
default:
if (FD_ISSET(*s,&rfds)) //如果s是fds中的一員返回非0,否則返回0
return 1;
if (FD_ISSET(*s,&wfds))
return 2;
return 0;
};
}
}