【问题标题】:Socket select reducing the number of sockets in file descriptor set套接字选择减少文件描述符集中的套接字数量
【发布时间】:2011-06-01 21:03:58
【问题描述】:

我有一段代码可以接受 2 个连接,用它们各自的套接字创建一个文件描述符集,然后将其传递给选择。但是当select返回时,文件描述符集中的文件描述符数量减少为1,select只能检测到fd_array数组中第一个socket的接收数据。

有什么我应该看的想法吗?

提前致谢,

安德烈

fd_set mSockets; /* 在此刻 mSockets.fd_count = 2 mSockets.fd_array[0] = 3765 mSockets.fd_array[1] = 2436 */ select(0, & mSockets, 0, 0, 0); /* 在此刻 mSockets.fd_count = 1 mSockets.fd_array[0] = 3765 mSockets.fd_array[1] = 2436 */

【问题讨论】:

    标签: c++ sockets select


    【解决方案1】:

    也就是说,选择函数的 readfds、writefds 和 exceptfds 参数是 in/out 参数。

    您应该在每次调用 select 之前初始化 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的返回值。如果您可以使用套接字进行操作,则表示无效。 IE。返回零表示所有 FD_ISSET amcro 都将返回 0。

    编辑:

    由于 readfds、writefds 和 exceptfds 也是 select 函数的 out 参数,因此对其进行了修改。 fd_count 成员表示有多少 fd_array 成员是有效的。如果 fd_count 小于 2,则不应评估 fd_array[1]

    【讨论】:

    • 实际上,使用 FD_ZERO 和 FD_SET 正确设置了 mSockets,方法与您相同。问题是 select 正在将 fd_count 字段从 2 减少到 1,我不知道为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2015-05-09
    • 1970-01-01
    • 2014-04-25
    • 2010-11-16
    相关资源
    最近更新 更多