C++ Boost.Asio - tcp 套接字异步写入
Posted
技术标签:
【中文标题】C++ Boost.Asio - tcp 套接字异步写入【英文标题】:C++ Boost.Asio - tcp socket asynchronous write 【发布时间】:2014-01-01 21:57:51 【问题描述】:场景:
在对象 A(线程 A)内部,正在异步读取和写入 boost::asio::ip::tcp::socket。
对象 B(线程 B)将数据发送到对象 A 的数据队列。
对象 A 应尽快将数据写入其数据队列中。
如何高效实现第三点?
现在我正在这样做:
队列中可能没有数据。
socket->async_send(data, handler);
内部处理程序:回到第二点。
我担心这种方法效率非常低 - 大多数时候使用零长度数据调用 async_send,直到可以发送实际数据。
也许更好的方法是在对象 A 中增加一个线程,在发布新数据后立即在套接字上执行同步写入?从对象 B 的线程执行写入是没有问题的。
【问题讨论】:
【参考方案1】:首先,除非您有充分的理由这样做,否则我个人不会将其分解为每个对象 1 个线程。
相反,有一个共享的io_service
(只需通过引用 A 和 B ctor 来传递它。然后在 io_serice.run()
上有一个线程。
假设其中一个对象也是 async_reading,您无需写入 0 长度数据并在处理程序中创建循环。只需将async_write
安排为数据传入的时间。
【讨论】:
【参考方案2】:“对象 A 应该尽快将数据写入其数据队列中”可以理解为等待 C++ 未来,因此您检查 answer 和 boost::asio::example 和最后一个但并非最不重要的是,我认为您的“数据队列”需要进行一些改进,您可以查看that answer。
【讨论】:
以上是关于C++ Boost.Asio - tcp 套接字异步写入的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 boost::asio::ip::tcp::socket 的 IP 地址?
如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数
如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)