c++ - 当 TCP TX 缓冲区填满时,boost::asio 会发生什么?

标签 c++ sockets asynchronous boost tcp

我正在尝试掌握 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/

相关文章:

c++ - 快速使缓存失效

c++ - WinApi 相当于 .NET KeyPreview

javascript - 为什么我没有从 JS 客户端(作为 Chrome 扩展)收到任何内容?

c# - 无法访问已处置的对象。对象名称 : 'System.Net.HttpListener'

iphone - 我如何处理异步意大利面条代码?

node.js - 使用 Async/Await 拒绝/解决 - 错误处理

c++ - 了解将使用哪个 swprintf(或者再次将 char* 字符串转换为 wchar_t*)

c++ - 主 Makefile 中 undefined reference

类的 Java 菜单栏操作

在 C linux 中关闭服务器套接字