我正在尝试掌握 boost asio,但我无法理解异步接口(interface)背后的某些行为。
我有一个简单的客户端和服务器设置。
- 客户端定时调用async_write,数据量固定
- 服务器定期轮询数据
- 当服务器停止轮询数据时会发生什么?
我猜各种缓冲区会在服务器操作系统中填满并且它会停止发送 ACK?
无论发生什么,客户端似乎都可以愉快地继续发送数 GB 的数据而不会收到任何错误回调(当然也不会收到任何成功)。
我假设客户端操作系统在某一时刻停止接受数据包,因为它们无法被发送?
这是否意味着 boost::asio 在内部缓冲数据?
如果是这样,我可以使用 socket.cancel() 来丢弃数据包以防我不想等待交付吗? (我需要确保 ASIO 忘记我的数据包,以便我可以为新数据包重用旧缓冲区)
最佳答案
asio 不在内部缓冲。如果您无法将更多数据传输到 Remote ,您将始终收到信号。
例如如果您在 asio 中使用同步写入,它们将阻塞直到数据可以发送(或至少被复制到内核发送缓冲区)。如果您使用异步写入,回调/确认只会在可以发送后被调用。如果你使用非阻塞写入,你会得到 EAGAIN/WOULD_BLOCK 错误。如果您并行使用多个 async_write,那么您不应该这样做,根据 asio 文档,它的行为是未定义的:
This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.
在您的应用程序中保证您始终只执行一个异步写入操作,一旦完成写入下一条数据。如果您需要在两者之间写入数据,则需要在您的应用程序中对其进行缓冲。
关于c++ - 当 TCP TX 缓冲区填满时,boost::asio 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41473627/