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

时间:2017-01-04 21:36:31

标签: c++ sockets asynchronous boost tcp

我试图掌握boost asio,但我无法理解异步接口背后的一些行为。

我有一个简单的设置,包括客户端和服务器。

  • 客户端定期使用固定数量的数据调用async_write
  • 服务器定期轮询数据
  • 当服务器停止轮询数据时会发生什么?

我猜各种缓冲区会填满服务器操作系统,它会停止发送ACK吗?

无论发生什么,似乎客户端可以愉快地继续发送几千兆字节的数据而不会收到任何错误回调(当然也没有收到任何成功)。

我认为客户端操作系统在一个点上停止接受数据包,因为它们无法被TX发送?

这是否意味着boost :: asio在内部缓冲数据?

如果是的话,我可以使用socket.cancel()丢弃数据包,以防我不想等待发送吗? (我需要确保ASIO忘记了我的数据包,这样我就可以重新使用旧缓冲区了解新数据包)

1 个答案:

答案 0 :(得分:2)

asio不会在内部缓冲。如果您无法将更多数据传输到遥控器,您将始终发出信号。

E.g。如果在asio中使用同步写入,它们将阻塞,直到可以发送数据(或至少将其复制到内核发送缓冲区中)。如果使用异步写入,则只有在可以发送回调/确认后才会调用它。如果使用非阻塞写入,则会出现EAGAIN / WOULD_BLOCK错误。如果您并行使用多个async_write - 那么 - 你不应该这样做,根据asio docs,它的行为是未定义的:

  

此操作是根据对流的async_write_some函数的零次或多次调用实现的,并且称为组合操作。程序必须确保流不执行其他写操作(例如async_write,流的async_write_some函数或执行写入的任何其他组合操作),直到此操作完成。

保证在您的应用程序中始终只执行单个异步写入操作,并且一旦完成写入下一个数据。如果您需要在两者之间写入数据,则需要在应用程序内缓冲它。