写入(boost asio)TCP套接字:一个接一个或全部同时写入

时间:2012-09-28 15:05:30

标签: c++ networking tcp boost-asio

我有一台TCP服务器,我必须同时向多个套接字发送数据。 我正在使用boost来实现这一目标。

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

我想知道在一个套接字上调用boost::asio::async_write并等待回调(然后在下一个套接字上调用它)是否会有任何区别和优势......

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

请注意,我不是网络专家,如果我在这里遇到任何问题,请随时发表评论。

异步:

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

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

同步:

  • 进行同步通话的优势是它们更易于实施和理解。

  • 缺点会阻止直到获得结果。这可能会使系统变得非常慢并且可能出现死锁。

答案 2 :(得分:1)

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

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