【问题标题】:Select() problems in C (windows 7)C 中的 Select() 问题(Windows 7)
【发布时间】:2009-11-06 02:29:47
【问题描述】:

我正在尝试创建一个使用 select() 来处理多个客户端的服务器,而不是我已经完成的多线程。然而 select() 似乎什么也没做?我有所有必要的系统调用,例如socket() 返回一个名为 listener 的 int。 bind() 然后listen(),都带有适当的错误检查,不会返回任何问题。它也编译得很好。

FD_ZERO(&fileDescriptors);
FD_ZERO(&tempSet);
.....
FD_SET(listener, &fileDescriptors);
fdmax = listener;
.....
while(1){
   if(select(fdmax+1, &tempSet, NULL, NULL, &timeout) == -1){
          //error occured
   }
.....
}

客户端无法建立连接,但是 WSAGetLastError() 在客户端返回 0。并且服务器永远不会通过 select(),除了由于超时返回 0。 我真的很难在我的代码中看到问题。

【问题讨论】:

    标签: c windows network-programming winsock select-function


    【解决方案1】:

    您将listener 添加到集合fileDescriptors,但是您将(空)集合tempSet 传递给select

    在您的评论中,您说您实际上有代码“设置 tempSet 等于 fileDescriptors”。一般来说,你不能这样做——你对fd_set的内部结构一无所知,它可能有需要深度复制的指针。

    很遗憾没有FD_COPY - 但就是这样。您每次都必须使用FD_ZEROFD_SET 构造集合。

    【讨论】:

    • 抱歉,我错过了将 tempSet 设置为 fileDescriptors 的部分代码
    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多