这只是一个简单的问题,即 async_write 如何处理 tcp 套接字。基本上,当使用 tcp 套接字时,写入处理程序是否会在数据写入套接字时被调用,或者当从目标接收到 ack 时?
问问题
300 次
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 个不同的套接字启动操作的场景。以下任何顺序都是可能的:
async_write
操作 1 完成。- 调用操作 1 的处理程序。
async_write
操作 2 完成。- 调用操作 2 的处理程序。
async_write
操作 1 完成。async_write
操作 2 完成。- 调用操作 1 的处理程序。
- 调用操作 2 的处理程序。
async_write
操作 1 完成。async_write
操作 2 完成。- 调用操作 2 的处理程序。
- 调用操作 1 的处理程序。
于 2013-07-09T17:38:48.483 回答
0
我认为您需要高层协议。如果远程对等程序破坏了您的请求包,则 ACK 也不适合您的需要。
于 2013-07-11T02:39:32.500 回答