使用tcp套接字执行async_write时,处理程序何时被调用?

时间:2013-07-09 15:36:58

标签: c++ boost boost-asio

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

  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的处理程序。

答案 3 :(得分:0)

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