重叠的消息名为pipe,ERROR_MORE_DATA和CancelIoEx

时间:2012-03-27 02:06:52

标签: c++ windows winapi named-pipes

我第一次使用$ SUB并遇到了这个问题。客户端和服务器都使用重叠操作,这是我遇到问题的具体情况。

客户端

C1。连接到服务器 C2。发送大于管道缓冲区的消息,并将缓冲区传递给服务器中的重叠读取操作 C3。成功取消发送操作。

服务器

S1。创建并等待客户 S2。连接客户端时,它会读取消息 S21。因为消息不适合缓冲区(ERROR_MORE_DATA),所以它是逐个读取的。

在我看来,没有办法告诉整个消息什么时候作为一个孤立的单位被取消了。特别是,如果客户端取消发送操作,服务器不会收到整个消息,只是其中的一部分,并且后续读取操作返回ERROR_IO_PENDING(在我的情况下),这意味着没有数据要读取和读取操作具有排队了。我希望能有某种方式告诉读者该消息已被取消,以便读者可以采取行动。

但是,相关文档分散在MSDN上,所以我可能会遗漏一些东西。如果有人能说清楚它,我真的很感激。感谢。

1 个答案:

答案 0 :(得分:0)

你是对的,没有办法说出来。

如果您中途取消Writefile,则只会写入部分消息,因此服务器只会读取该部分。没有"簿记"在取消消息之前发送的有关消息大小的信息 - 发送的只是原始数据。

所以答案是:不要取消IO,只需等待它成功。

如果您执行需要中途取消IO,您应该切断连接并从头开始重新启动,就像网络中断一样。

(你可以检查你的OVERLAPPED结构,看看实际写了多少,并从那里继续,但如果你想这样做,你可能不会首先取消IO。)

为什么要取消IO呢?什么情况触发了这一要求?