【问题标题】:How to use the socket select function如何使用套接字选择功能
【发布时间】:2021-06-13 19:30:44
【问题描述】:

我正在尝试理解套接字select 函数。

第一个参数,我读到 nfds 可以忽略,应该是最高描述符值,并且应该是最大计数 + 1。

这个数字应该是多少?

如果我通过 FD_SET() 添加了 select fds,当 select 返回时...

遍历所有设置的 fd 的方法是什么(例如可读)

做类似的事情

if ( FD_SET(socket1, &fds) )
 ...
if ( FD_SET(socket2, &fds) )
  ...

我想我可以将它们放在一个数组中 - 但我希望会有一个迭代器函数。

【问题讨论】:

    标签: sockets select


    【解决方案1】:

    我听说nfds 可以忽略

    仅适用于 Windows 上的 WinSock 的 select()。对于其他平台上的select(),需要nfds

    第一个参数 ... 应该是一个最高描述符值,并且应该是 max count + 1。

    这个数字应该是多少?

    正是你刚才所说的:“还有一个最高描述符值”。因此,例如,如果您在fds 中只有socket1,那么nfds 需要是socket1 + 1。如果fds 中有socket1socket2,则nfds 需要为max(socket1, socket2) + 1。以此类推,您添加到fds 的描述符越多。

    如果我通过 FD_SET() 添加了 select fds,当 select 返回时...

    遍历所有设置的 fd 的方法是什么(例如可读)

    没有。至少,不是便携的方式。您需要单独测试每个套接字,例如:

    if ( FD_ISSET(socket1, &fds) ) {
        ...
    }
    if ( FD_ISSET(socket2, &fds) ) {
        ...
    }
    

    如果您将 socket1socket2 放入数组/列表中,则可以改为枚举它,例如:

    SOCKET sockets[] = ...;
    int numSockets = ...;
    
    for(int i = 0; i < numSockets; ++i) {
        if ( FD_ISSET(sockets[i], &fds) ) {
            ...
        }
    }
    

    我希望会有一个迭代器函数。

    没有。

    【讨论】:

    • 所以第一个参数应该是 max(socket1, socket2) + 1 而不是 3 在你的例子中。它是最高描述符值 + 1。对吗?
    • @dashman "这是最高描述符值 + 1。正确吗?" - 是的
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多