我正在 Windows 上使用 IOCP(I/O 完成端口)模型开发服务器,我对 WSASend 操作的排序保证有疑问。具体来说,我需要了解 Windows 是否按照调用的顺序处理 WSASend 操作,而与 TCP 的有序交付保证无关。 例如,如果我连续进行两次 WSASend 调用,并且第一个调用的数据负载较大,复制时间较长,我不确定 Windows 如何处理这种情况。当使用 WSARecv 和 GetQueuedCompletionStatus 时,我需要了解服务器端的发送顺序和客户端的接收顺序。
我正在实现一个 IOCP 服务器,其中消息处理的顺序至关重要。虽然我了解 TCP 保证数据包的有序传送,但我特别关心 Windows IOCP 实现本身的行为。
我想知道:
我搜索了 Windows 文档,但没有找到有关 IOCP 操作特定的排序保证的明确答案。
WSASend
只是将缓冲区添加到要发送的操作系统内部缓冲区列表中。这就是为什么您需要确保缓冲区在完成之前保持有效。内部列表当然是一个 FIFO。向此列表添加内容实际上是即时的,并且不依赖于所添加缓冲区的size。
WSARecv
当使用多个缓冲区调用时,将按指示的顺序使用这些缓冲区,并达到最大容量。特别是,由于 TCP 没有消息,因此在将任何内容写入第二个缓冲区之前,第一个缓冲区将被填充到最后一个字节。 WSARecv
无法将来自 WSASend
的第 N 条消息放入第 N 个接收缓冲区中。 (除非您碰巧有固定大小的消息和匹配的固定大小的缓冲区,在这种情况下,协议设计会发生这种情况)