2

我正在尝试创建一个使用 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。我真的很难在我的代码中看到问题。

4

1 回答 1

2

您正在添加listener到 set fileDescriptors,但是您将 (empty) set 传递tempSetselect.

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

遗憾的是没有FD_COPY——但就是这样。您必须每次使用FD_ZERO和构造集合FD_SET

于 2009-11-06T02:32:18.010 回答