我第一次使用$ SUB并遇到了这个问题。客户端和服务器都使用重叠操作,这是我遇到问题的具体情况。
客户端
C1。连接到服务器
C2。发送大于管道缓冲区的消息,并将缓冲区传递给服务器中的重叠读取操作
C3。成功取消发送操作。
服务器
S1。创建并等待客户
S2。连接客户端时,它会读取消息
S21。因为消息不适合缓冲区(ERROR_MORE_DATA),所以它是逐个读取的。
在我看来,没有办法告诉整个消息什么时候作为一个孤立的单位被取消了。特别是,如果客户端取消发送操作,服务器不会收到整个消息,只是其中的一部分,并且后续读取操作返回ERROR_IO_PENDING(在我的情况下),这意味着没有数据要读取和读取操作具有排队了。我希望能有某种方式告诉读者该消息已被取消,以便读者可以采取行动。
但是,相关文档分散在MSDN上,所以我可能会遗漏一些东西。如果有人能说清楚它,我真的很感激。感谢。
答案 0 :(得分:0)
你是对的,没有办法说出来。
如果您中途取消Writefile,则只会写入部分消息,因此服务器只会读取该部分。没有"簿记"在取消消息之前发送的有关消息大小的信息 - 发送的只是原始数据。
所以答案是:不要取消IO,只需等待它成功。
如果您执行需要中途取消IO,您应该切断连接并从头开始重新启动,就像网络中断一样。
(你可以检查你的OVERLAPPED结构,看看实际写了多少,并从那里继续,但如果你想这样做,你可能不会首先取消IO。)
为什么要取消IO呢?什么情况触发了这一要求?