WSAPolll 更改 FDSET 中的数据,并返回由于 WSAENOTSOCK 而导致的错误.我是否正确使用 WSAP

WSAPoll changing data in FDSET and returning an error due to WSAENOTSOCK. Am I using WSAPoll() correctly?

本文关键字:错误 是否 WSAP WSAENOTSOCK 数据 FDSET 更改 返回 WSAPolll      更新时间:2023-10-16

下面是使用 WSAPoll 所需的最少代码,不包括初始化(socket()bind()listen()accept()等(或它之前的任何条件。您可以使用文档中的示例服务器代码,sockClientSocket为基础。

运行它,每行的值变化如下:

// ...
// 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,errnoWSAENOTSOCK(10038(。

现在,这里的问题是sock是一个完全有效的文件描述符;套接字。recv()send()工作正常,没有任何错误。
另一方面,文件描述符262500,不是那么多。

我是轮询正确还是不知何故没有正确转换它,因为它看起来不需要转换,因为SOCKETfd_array只是一个/一个单数/数组的unsigned __int64(s(。

你混淆了参数来select()poll()/WSAPoll()

select()FDSET作为参数。poll()/WSApoll()pollfd数组作为参数。

引用的Microsoft文档中的超链接(用于WSAPOLLFD参数的描述(似乎符合 404 标准。也许你可以在其他地方找到它,或者使用Linux版本的文档,(谷歌关键字:struct pollfd(。

你的编译器很可能正在向你大喊警告消息和其他淫秽内容;因为要WSAPoll的第一个参数的类型显然是错误的指针类型。如果是这样,这是一个很好的教训,永远不要忽略来自C++编译器的警告消息,即使它仍然编译你的程序。

相关文章: