1

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

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

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

4

3 回答 3

2

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

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

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

于 2012-09-28T18:21:19.437 回答
1

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

异步:

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

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

同步:

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

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

于 2012-09-28T15:56:36.413 回答
1

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

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