[英]Socket select reducing the number of sockets in file descriptor set
我有一段代码接受2个连接,用各自的套接字创建一个文件描述符集,并将其传递给select。 但是,当select返回时,文件描述符集中的文件描述符数量减少为1,而select可以仅检测fd_array数组中第一个套接字的接收数据。
有什么想法我应该看的吗?
提前致谢,
安德烈
fd_set mSockets; /* At this point mSockets.fd_count = 2 mSockets.fd_array[0] = 3765 mSockets.fd_array[1] = 2436 */ select(0, & mSockets, 0, 0, 0); /* At this point mSockets.fd_count = 1 mSockets.fd_array[0] = 3765 mSockets.fd_array[1] = 2436 */
也就是说,选择功能的readfds,writefds和exceptfds参数是输入/输出参数。
您应该在每次调用之前初始化fd_set来选择:
SOCKET s1;
SOCKET s2;
// open sockets s1 and s2
// prepare select call
FD_ZERO(&mSockets);
FD_SET(s1, &mSockets);
FD_SET(s2, &mSockets);
select(0, &mSockets, 0, 0, 0);
// evaluate select results
if (FD_ISSET(s1, &mSockets))
{
// process s1 traffic
}
if (FD_ISSET(s2, &mSockets))
{
// process s2 traffic
}
另外,cou可以检查select的返回值。 如果您完全可以使用插座操作,则表示无效。 即返回零表示所有FD_ISSET amcro将返回0。
编辑:
由于readfds,writefds和exceptfds也出了选择功能paramters,他们被修改。 fd_count成员指示有效的fd_array成员数。 如果fd_count
小于2,则不应评估fd_array[1]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.