下面是使用 WSAPoll 所需的最少代码,不包括初始化( socket()
、 bind()
、 listen()
、 accept()
等)或其之前的任何条件。您可以使用 sample server code来自文档和 sock
将是ClientSocket
作为基础。
运行它,每行的值都会发生如下变化:
// ...
// socket(), bind(), listen(), etc.
// sock = accept(...)
// See boilerplate linked.
SOCKET sock; // sock = 356
FDSET set; // Some garbled data, though should be same as below:
FD_ZERO(&set); // fd_count = 0, fd_array = [14757395258967641292, x64]
FD_SET(sock, &set); // fd_count = 1, fd_array = [356, 14757395258967641292 x63]
int iResult = WSAPoll(&set, 1, 1) // iResult = -1
// fd_count = 1, fd_array = [262500, 14757395258967641292 x63]
int errid = WSAGetLastError(); // errid = WSAENOTSOCK (10038)
// if (iResult > 0)
// recv(), etc.
如果我没看错的话, WSAPoll()
应该模拟 poll()
。所以,当我存储sock
时进入set
,它正确存储它,但是当它传递到 WSAPoll()
时但是,值会发生变化,并返回 -1 errno
是WSAENOTSOCK
(10038)。
现在,这里的问题是sock
是一个完全有效的文件描述符; socket 。 recv()
和send()
工作正常,没有任何错误。
文件描述符262500
另一方面,没有那么多。
我轮询是否正确,或者我是否以某种方式没有正确转换它,因为它看起来不需要从 SOCKET
开始转换和fd_array
只是 unsigned __int64
的一个/一个单数/数组(小)。
最佳答案
您混淆了 select()
和 poll()/WSAPoll()
的参数。
select()
采用 FDSET
作为参数。 poll()/WSApoll()
采用 pollfd
数组作为参数。
所引用的 Microsoft 文档中用于描述 WSAPOLLFD
参数的超链接似乎符合 404 标准。也许你可以在其他地方找到它,或者使用 Linux 版本的文档(Google 关键字:struct pollfd
)。
您的编译器也很可能会向您发出警告消息和其他脏话;因为WSAPoll
的第一个参数的类型显然是错误的指针类型。如果是这样,这是一个很好的教训,永远不要忽略来自 C++ 编译器的警告消息,即使它仍然编译您的程序。
关于c++ - WSAPoll 更改 FDSET 中的数据并由于 WSAENOTSOCK 返回错误。我正确使用 WSAPoll() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57701436/