3

这只是一个简单的问题,即 async_write 如何处理 tcp 套接字。基本上,当使用 tcp 套接字时,写入处理程序是否会在数据写入套接字时被调用,或者当从目标接收到 ack 时?

4

4 回答 4

4

AFAIK,一旦数据写入套接字的内核缓冲区,处理程序就会被调用。

于 2013-07-09T15:40:06.257 回答
2

与 BSD 套接字的行为相同send()- 它在操作系统拥有数据副本时完成。这将在 ACK 之前。

于 2013-07-09T15:41:06.697 回答
2

Boost.Asio 提供的唯一保证是在操作完成时将调用处理程序。在 的情况下async_write,当满足以下任一条件时,操作被视为完成:

  • 整个缓冲区序列已写入流。
  • 操作已取消。例如。socket_.cancel().
  • 发生错误。例如,远程端点关闭其套接字。

操作完成后,将发布处理程序以进行延迟调用。但是,未指定调用处理程序的确切时间和顺序。async_write考虑为 2 个不同的套接字启动操作的场景。以下任何顺序都是可能的:

  1. async_write操作 1 完成。
  2. 调用操作 1 的处理程序。
  3. async_write操作 2 完成。
  4. 调用操作 2 的处理程序。
  1. async_write操作 1 完成。
  2. async_write操作 2 完成。
  3. 调用操作 1 的处理程序。
  4. 调用操作 2 的处理程序。
  1. async_write操作 1 完成。
  2. async_write操作 2 完成。
  3. 调用操作 2 的处理程序。
  4. 调用操作 1 的处理程序。
于 2013-07-09T17:38:48.483 回答
0

我认为您需要高层协议。如果远程对等程序破坏了您的请求包,则 ACK 也不适合您的需要。

于 2013-07-11T02:39:32.500 回答