繁体   English   中英

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

[英]When performing an async_write with a tcp socket, when is the handler called?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM