处理套接字的WSA_IO_PENDING ::发送
handling WSA_IO_PENDING for socket ::send
result = ::send(s, buf, length, flag)
最终将发送多少数据?当我得到result == SOCKET_ERROR
和WSAGetLastError () == WSA_IO_PENDING
最终会发送length
字节的buf
吗?
或者我需要尝试再次重新发送相同的 buf 数据?
另一方面
WSA_IO_PENDING
重叠的操作将在稍后完成。
应用程序已启动无法立即完成的重叠操作。稍后将给出完成指示 当操作完成时。
在我看来,发送操作将在稍后完成....
更新:进一步的问题在这里问 阻塞(重叠的 I/O(Winsock2 调用引起的意外WSA_IO_PENDING
从您链接的文档页面:
如果未发生错误,send 将返回发送的总字节数,该字节数可以小于 len 参数中请求发送的字节数。否则,返回值 SOCKET_ERROR
也就是说,如果result == SOCKET_ERROR
那么什么都没有发送。
至于WSA_IO_PENDING
,如果您使用的是异步io,则可能会发生这种情况,例如WSASend
。在这种情况下,实际发送的字节数需要稍后检索,可能使用 io 完成例程。
经过一些研究和实验。 以下是一些事实。
::socket 将启用隐式重叠属性。
可以通过 ::WSASocket 或通过 setsocketopt/SO_OPENTYPE 创建没有重叠属性WSA_FLAG_OVERLAPPED
的套接字,但是超时功能(例如SO_RCVTIMEO
( 需要重叠属性。
使用 ::send ::recv 时,可能会出现WSA_IO_PENDING错误,应该使用 WSAGetOverlappedResult 来处理(我从 Windows 10 开始观察到这种行为(
或者,改用 ::WSARecv 或 ::WSASend。
还有一些问题没有被问到:
更新:进一步的问题在这里问 阻塞(重叠的 I/O(Winsock2 调用引起的意外WSA_IO_PENDING
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- 从套接字 C++ 发送和接收文件
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在类中封装C/C++套接字发送和接收函数?
- 通过 c++ 中的套接字发送 html
- 通过套接字 c++ 发送长度和数据
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- Visual Studio(C++):如何使用TCP套接字发送多个值
- 无法通过套接字发送或接收数据
- 通过 TCP 套接字发送大型 base64 字符串
- 无法通过 C++ 中的套接字发送字符串流变量
- 如何通过套接字发送OpenCV Mat
- 如何使用套接字C++发送邮件
- 套接字发送(.)线程的最佳数量
- C++ 套接字 - 发送 - 未收到数据
- 通过套接字发送的自定义数据包
- 通过套接字发送整数数组时出现问题
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 如何使用 boost asio 通过 UDP 套接字发送无符号字符的 std::vector?
- 如何通过套接字发送 QMap