重叠的消息命名为管道、ERROR_MORE_DATA和CancelIoEx
Overlapped message named pipe, ERROR_MORE_DATA and CancelIoEx
我第一次使用$SUB,遇到了这个问题。客户端和服务器都使用重叠操作,下面是我遇到的问题。
客户端
C1.连接到服务器
C2.发送大于管道缓冲区和传递给服务器中重叠读取操作的缓冲区的消息
C3.成功取消发送操作
服务器
S1.创建并等待客户端
S2.当客户端连接时,它读取消息
S21.因为消息不适合缓冲区(ERROR_MORE_DATA),所以它被逐部分读取
在我看来,作为一个孤立的单元,没有办法判断整个消息何时被取消。特别是,如果客户端取消发送操作,则服务器不会接收到整个消息,只接收到其中的一部分,随后的读取操作将返回ERROR_IO_PENDING(在我的情况下),这意味着没有要读取的数据,并且读取操作已在队列中。我希望有某种方式告诉读者消息已经被取消,这样读者就可以对它采取行动
然而,相关文档分散在MSDN上,所以我可能遗漏了一些内容。如果有人能透露一些情况,我将不胜感激。谢谢。
你是对的,没有办法判断。
如果中途取消Writefile,则只会写入消息的一部分,因此服务器只会读取该部分。在您取消消息之前,没有发送关于消息大小的"记账"信息——发送的只是原始数据。
所以答案是:不要取消IO,只需等待它成功。
如果确实需要在中途取消IO,则可能应该切断连接并从头开始,就像在网络中断时一样。
(你可以检查你的OVERLAPPED结构,找出实际写了多少,然后继续,但如果你想这样做,你可能一开始就不会取消IO。)
为什么要取消IO?是什么情况触发了这一要求?
相关文章:
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ 初始化 .data 部分中的变量
- 模式"allocate memory or use existing data"
- boost::asio data owning `ConstBufferSequence`
- Python to C++ Data structure API
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- protobuf C++ SQLite handle blob data
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- 为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
- "thread-safe data"与"thread-safe code/functions"的区别
- 如何找到目标文件 *.o 的 ram rom 使用情况(.bss .text .rodata .data)?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- *(int*)&data[18]在这段代码中实际上做了什么?
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 构造中错误:未在此范围中声明"data"
- 我可以在初始化之前使用 std::array 成员变量中的 data() 指针吗?发出警告
- 如何将data[i].int转换为vaible