WSASend 在 Windows 上的 IOCP 模型中是否保证处理顺序?

问题描述 投票:0回答:1

我正在 Windows 上使用 IOCP(I/O 完成端口)模型开发服务器,我对 WSASend 操作的排序保证有疑问。具体来说,我需要了解 Windows 是否按照调用的顺序处理 WSASend 操作,而与 TCP 的有序交付保证无关。 例如,如果我连续进行两次 WSASend 调用,并且第一个调用的数据负载较大,复制时间较长,我不确定 Windows 如何处理这种情况。当使用 WSARecv 和 GetQueuedCompletionStatus 时,我需要了解服务器端的发送顺序和客户端的接收顺序。

我正在实现一个 IOCP 服务器,其中消息处理的顺序至关重要。虽然我了解 TCP 保证数据包的有序传送,但我特别关心 Windows IOCP 实现本身的行为。

我想知道:

  1. 如果 WSASend 操作按照应用程序调用的确切顺序进行处理
  2. 客户端的 WSARecv(与 GetQueuedCompletionStatus 一起使用时)是否会按照与服务器的 WSASend 调用相同的顺序接收数据
  3. Windows 如何处理由于数据量较大而导致第一个 WSASend 调用可能需要更长时间处理的情况

我搜索了 Windows 文档,但没有找到有关 IOCP 操作特定的排序保证的明确答案。

c++ windows network-programming tcp iocp
1个回答
0
投票

WSASend
只是将缓冲区添加到要发送的操作系统内部缓冲区列表中。这就是为什么您需要确保缓冲区在完成之前保持有效。内部列表当然是一个 FIFO。向此列表添加内容实际上是即时的,并且不依赖于所添加缓冲区的size

WSARecv
当使用多个缓冲区调用时,将按指示的顺序使用这些缓冲区,并达到最大容量。特别是,由于 TCP 没有消息,因此在将任何内容写入第二个缓冲区之前,第一个缓冲区将被填充到最后一个字节。
WSARecv
无法将来自
WSASend
的第 N 条消息放入第 N 个接收缓冲区中。 (除非您碰巧有固定大小的消息和匹配的固定大小的缓冲区,在这种情况下,协议设计会发生这种情况)

© www.soinside.com 2019 - 2024. All rights reserved.