是否存在使用accept
函数接受客户端而不将套接字设置为非阻塞的超时交叉平台解析?
我知道我应该使用select
函数,但我做错了什么?
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;
}
如何解决这个问题? 谢谢!
答案 0 :(得分:3)
select
调用的第一个参数应该等于fd_set集中的最高编号文件描述符加1(参见here)。尝试将第一个参数更改为s+1
;当你的集合中有多个套接字时,你需要添加一些逻辑。
答案 1 :(得分:1)
select()的第一个参数是一个int,它比任何位集中的文件描述符的最高值至少高1 大。在这种情况下
iResult = select(s + 1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
应该有用。
答案 2 :(得分:1)
select()
如果发出套接字信号则返回> 0,超时时返回0,错误时返回-1。 select()
实际上回报给你的是什么价值?你只检查> 0和< = 0,这意味着你没有区分-1和0.如果它返回0然后没有客户端连接到你的套接字,但如果它返回-1然后你的套接字可能无法开始使用。