如何接受套接字超时

是否有超时跨平台接受客户端使用accept函数,而不是设置套接字到非阻塞?

我知道我应该使用selectfunction,但是我做错了什么?

 SOCKET NativesAcceptClient(SOCKET s, int timeout) { int iResult; struct timeval tv; fd_set rfds; FD_ZERO(&rfds); FD_SET(s, &rfds); tv.tv_sec = (long)timeout; tv.tv_usec = 0; iResult = select(s, &rfds, (fd_set *) 0, (fd_set *) 0, &tv); if(iResult > 0) { return accept(s, NULL, NULL); } else { //always here, even if i connect from another application } return 0; } 

如何解决这个问题? 谢谢!

select调用的第一个参数应该等于fd_set集合中最大的文件描述符加1(参见这里 )。 尝试将第一个参数更改为s+1 ; 当你的套件中有多个套接字时,你需要添加一些逻辑。

如果套接字发信号, select()返回> 0,超时时为0,错误时为-1。 select()实际返回给你什么值? 你只是检查> 0和<= 0,这意味着你不区分-1和0.如果它返回0然后没有客户端连接到你的套接字,但如果它返回-1那么你的套接字可能无效开始。

select()的第一个参数是一个int,比任何位集中的文件描述符的最大值至少大1。 在这种情况下

 iResult = select(s + 1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv); 

应该管用。