在来自服务器的 IO 完成端口中使用 TCP,如果我在同一个套接字中连续两次 WSASend
,第一个发送“ABC”,第二个发送“DEF”,然后当我调用 GetQueuedCompletionStatus
它告诉我第一个 WSASend
只发送了“AB” 然后我再次调用 GetQueuedCompletionStatus
它告诉我第二个 WSASend
发送“DEF”,客户端是否要接收“ABDEF”?还是第二个 WSASend
会因为第一个 WSASend
消息不完整而失败?
最佳答案
接收方将不会收到 ABDEF,因为这意味着违反了流的完整性。
如果您在 ABC 和 DEF 上(按此顺序)发出 WSASend() 并且您得到 ABC 的 2 个字节和 DEF 的 3 个字节的完成,接收方可能没有收到任何东西,A,AB,ABC,ABCD,ABCDE , 或 ABCDEF。不过,很可能他们除了 AB 之外没有收到任何东西。
当您完成 WSASend() 指示除完整发送之外的任何内容时,您应该终止套接字。 closesocket() 确实是你应该做的最后一件事;在此之前,您应该清空所有未完成的发送和接收(CancelIoEx()、shutdown() 等)。
关于c++ - 连续性多个 WSASend() io 完成端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242135/