WSAPolll 更改 FDSET 中的数据,并返回由于 WSAENOTSOCK 而导致的错误.我是否正确使用 WSAP
WSAPoll changing data in FDSET and returning an error due to WSAENOTSOCK. Am I using WSAPoll() correctly?
下面是使用 WSAPoll 所需的最少代码,不包括初始化(socket()
、bind()
、listen()
、accept()
等(或它之前的任何条件。您可以使用文档中的示例服务器代码,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
是一个完全有效的文件描述符;套接字。recv()
和send()
工作正常,没有任何错误。
另一方面,文件描述符262500
,不是那么多。
我是轮询正确还是不知何故没有正确转换它,因为它看起来不需要转换,因为SOCKET
和fd_array
只是一个/一个单数/数组的unsigned __int64
(s(。
你混淆了参数来select()
和poll()/WSAPoll()
。
select()
将FDSET
作为参数。poll()/WSApoll()
将pollfd
数组作为参数。
引用的Microsoft文档中的超链接(用于WSAPOLLFD
参数的描述(似乎符合 404 标准。也许你可以在其他地方找到它,或者使用Linux版本的文档,(谷歌关键字:struct pollfd
(。
你的编译器很可能正在向你大喊警告消息和其他淫秽内容;因为要WSAPoll
的第一个参数的类型显然是错误的指针类型。如果是这样,这是一个很好的教训,永远不要忽略来自C++编译器的警告消息,即使它仍然编译你的程序。
相关文章:
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- 以下 OpenCV 源代码中是否存在错误?(#ifdef 没有 #else)
- 是否与赢得64位有关?错误:STATUS_ACCESS_VIOLATION
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 当发生套接字错误时,作为QWebSocket基础的QTcpSocket(或QSslSocket)是否会自行销毁
- 仅捕获异常就可以检测所有二进制文件在C 中读取错误是否足够
- 如何查看错误是否仍然存在,如果它没有始终如一地明显表现出来?
- 如何检查编译器错误是否在CMD中显示
- 在无效函数中使用退出来纠正错误是否是一种好的做法
- 将构造函数声明为private会显示错误.是否至少有一个公共构造函数是必需的
- C++中的分段错误是否可以像在 Java 中处理 NullPointerExceptions 一样处理
- "位字段类型对于位数来说太小"错误是否属于C++标准?