asio - async_write_some的设计原因可能无法传输所有数据

时间:2016-03-31 08:58:08

标签: boost-asio

从用户看来,“可能无法传输所有数据”的属性是一件麻烦事。这将导致处理程序调用多次(可能)。

自由函数async_write只确保处理程序调用一次,但它要求调用者必须按顺序调用它,否则写入的数据将是交错的。对于网络应用程序的使用,这比处理程序被多次调用更糟糕。

如果用户想要只调用一次处理程序并且写入的数据是正确的,那么用户需要做一些事情。

我想问的是:为什么asio不只是让socket :: async_write_some传输所有数据?

1 个答案:

答案 0 :(得分:0)

  

我想问的是:为什么asio不只是make socket :: async_write_some   传输所有数据?

async_write相反,socket::async_write_some是较低级别的方法。

OS网络堆栈设计有发送缓冲区和接收缓冲区。需要使用一定量的内存来限制此缓冲区。当您通过套接字发送许多数据时,接收方可能比发送更慢和/或可能存在网络速度问题。

这就是套接字发送缓冲区受限的原因,因此系统的系统调用如 writev 应该能够通知用户程序该系统现在不能接受大块数据。对于套接字处于异步模式,它更为关键。因此,套接字系统调用无法以异步方式工作,而无需保留信号程序。

因此,async_write_some作为 writev 的中级包装需要支持部分写入。另一方面async_write是组合操作并且可以多次调用async_write_some以便发送缓冲区直到操作完成或可能失败。它只调用一次完成处理程序,而不是传递给网络堆栈的每个数据块。

  

如果用户想要只调用一次处理程序并且写入的数据是正确的,   用户需要做点什么。

没什么特别的,只是使用async_write,而不是socket::async_write_some