c++ - WSAPoll 更改 FDSET 中的数据并由于 WSAENOTSOCK 返回错误。我正确使用 WSAPoll() 吗?

标签 c++ c winsock2

下面是使用 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 errnoWSAENOTSOCK (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/

相关文章:

具有友元函数和运算符重载的 C++ 模板

c++ - 如何在 Visual C++ 中将浮点文字处理为 double 或 float ?

c++ - 映射共享库部分 : libhmmm. 时出错,因此:成功

c - Compiler 是否优化了由 "malloc()"函数分配的内存?

c - 如何在内核代码中获取子进程列表

c++ - 在网络库中初始化Winsock的最佳实践

c++ - 将用户输入转换为 C++ 类型的 if/else 语句过多

代码大小 : static inline vs inline for functions defined in header files

c - 在 Windows C 中获取与真实硬件以太网 Controller 关联的 IP 地址

sockets - 意外的WSA_IO_PENDING阻止了Winsock2调用(具有重叠的I/O属性)