是否有超时跨平台接受客户端使用accept
函数,而不是设置套接字到非阻塞?
我知道我应该使用select
function,但是我做错了什么?
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);
应该管用。