在来自服务器的 IO 完成端口中使用 TCP,如果我在同一个套接字中连续进行两个WSASend
,第一个发送“ABC”,第二个发送“DEF”然后当我调用GetQueuedCompletionStatus
它时告诉我第一个WSASend
只发送“AB”然后我再次打电话GetQueuedCompletionStatus
,它告诉我第二次WSASend
发送“DEF”,客户端是否要接收“ABDEF”?还是第二个WSASend
会因为第一WSASend
条消息不完整而失败?
问问题
81 次
1 回答
0
接收方将不会收到 ABDEF,因为这意味着违反了流的完整性。
如果您在 ABC 和 DEF(按此顺序)上发出 WSASend(),并且您获得 ABC 的 2 个字节和 DEF 的 3 个字节的完成,则接收方可能什么也没有收到,A、AB、ABC、ABCD、ABCDE 或 ABCDEF . 不过很可能,他们没有收到 AB 以外的任何东西。
当 WSASend() 的完成指示除完整发送之外的任何内容时,您应该终止套接字。closesocket() 确实是你应该做的最后一件事;在此之前,您应该排空所有未完成的发送和接收(CancelIoEx()、shutdown() 等)。
于 2016-09-28T19:54:08.930 回答