【发布时间】:2016-07-07 09:37:07
【问题描述】:
在来自服务器的 IO 完成端口中使用 TCP,如果我在同一个套接字中创建两个连续的 WSASend,第一个发送“ABC”,第二个发送“DEF”,然后当我调用 GetQueuedCompletionStatus 它告诉我第一个WSASend 只发送了“AB”,然后我再次调用GetQueuedCompletionStatus,它告诉我第二个WSASend 发送了“DEF”,客户端是否要接收“ABDEF”?或者第二个WSASend 会因为第一个WSASend 消息不完整而失败?
【问题讨论】:
-
这应该是不可能的。部分写入只应在发生致命事件时发生,从而完全阻止后续写入取得任何进展。你确定你没有按顺序处理完成吗? (虽然操作必须按开始的顺序完成,但不能保证您会按顺序接收/处理完成指示。)
-
我做的例子只是虚构的,所以我可以理解io完成端口是如何工作的。那么如果
WSASend发送了一个不完整的消息,是否意味着我应该关闭socket? -
你可以关闭套接字。您还可以发布另一个发送并查看您收到的错误。如果您有一个待处理,您也可以等待接收错误。
-
换句话说,您可以将其视为错误条件。大概你已经检查了操作是否返回了错误代码;在这种情况下,无论你做什么,在这种情况下你都可以做到。
标签: c++ winsock io-completion-ports