我有一台TCP服务器,我必须同时向多个套接字发送数据。 我正在使用boost来实现这一目标。
当我需要将数据发送到多个套接字时,我会使用我想发送的任何数据调用每个套接字boost::asio::async_write
。
我想知道在一个套接字上调用boost::asio::async_write
并等待回调(然后在下一个套接字上调用它)是否会有任何区别和优势......
答案 0 :(得分:2)
等待来自async_write的回调只会引入(基本上是随机的)延迟,但根本不会给你带来任何好处。
唯一的例外是如果底层协议没有任何拥塞控制 - 即使用UDP时,您可能希望在应用程序中实现某种拥塞控制,但即使这样等待async_write回调也不会是一个好主意(因为它只是告诉你数据已经传递给操作系统)。
但是当您使用TCP时,等待回调不会带来任何好处。
答案 1 :(得分:1)
请注意,我不是网络专家,如果我在这里遇到任何问题,请随时发表评论。
异步:
优点是在调用后立即返回控制权。因此,当我们等待验证调用的状态时,我们可以执行其他更高效的操作或产生CPU。这使异步系统更有效率。
缺点是很难进行异步调用。它们不需要锁和机制来进行呼叫的通信结果。这可能非常棘手。
同步:
进行同步通话的优势是它们更易于实施和理解。
缺点会阻止直到获得结果。这可能会使系统变得非常慢并且可能出现死锁。
答案 2 :(得分:1)
当async_write
操作发生错误或将所有数据写入套接字时, WriteHandler 可运行。因此,跨不同套接字发出多个异步写入可能会导致速度增加。但是,需要额外注意才能正确管理缓冲区。
shared_ptr
管理,则只需将shared_ptr
绑定到每个 WriteHandler 。pending_writes_
变量中,并使每个 WriteHandler 递减pending_writes_
。一旦pending_writes_
达到零,缓冲区就可以重用于其他操作。要序列化对pending_writes_
的修改,请将每个 WriteHandlers 包装在strand
中。