写入(提升 asio)TCP 套接字:一个接一个或同时写入所有套接字

writing to (boost asio) TCP sockets: one by one or all at the same time

本文关键字:一个 套接字 asio 写入 提升 TCP      更新时间:2023-10-16

我有一个TCP服务器,我必须同时将数据发送到多个套接字。我正在使用提升来做到这一点。

当我需要将数据发送到多个套接字时,我会调用每个套接字boost::asio::async_write我想发送的任何数据。

我想知道在一个套接字上呼叫boost::asio::async_write并等待回电(然后在下一个套接字上调用它......

等待来自async_write的回调只会引入(本质上是随机的)延迟,但根本没有给你带来任何好处。

唯一的例外是底层协议没有任何拥塞控制 - 即在使用UDP时,您可能希望在应用程序中实现某种拥塞控制,但即使这样,等待async_write回调也不是一个好主意(因为这只是告诉您数据已传递到操作系统)。

但是,当您使用 TCP 时,等待回调不会提供任何好处。

请注意,

我不是网络专家,所以如果我在这里弄错了,请随时发表评论。

异步:

  • 进行异步调用的优点是在调用后立即返回控制。因此,当我们等待验证呼叫状态时,我们可以做其他更高效的事情或产生CPU。这使得异步系统高效。

  • 缺点是很难进行异步调用。它们不需要呼叫通信结果的锁和机制。这可能很难实现。

同步:

  • 进行同步调用的优点是它们更易于实现和理解。

  • 缺点是它们会阻塞,直到获得结果。这会使系统非常慢,并且可能会死锁。

async_write操作发生错误或写入所有数据都写入套接字时,WriteHandler 是可运行的。 因此,跨不同套接字发出多个异步写入可能会导致速度提高。 但是,需要格外小心才能正确管理缓冲区

  • 如果缓冲区由 shared_ptr 管理,则只需将shared_ptr绑定到每个 WriteHandler
  • 如果缓冲区不是由智能指针管理的,则需要有一种机制来检测何时调用了最后一个 WriteHandler。 请考虑将挂起的写入处理程序的计数存储到 pending_writes_ 变量中,并让每个 WriteHandler 递减pending_writes_。 一旦pending_writes_达到零,缓冲区就可以重新用于其他操作。 要将修改序列化为pending_writes_,请将每个 WriteHandler 包装在一个strand中。
相关文章: