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 扩展 TCP 套接字

如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数

如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)

使用 boost::asio::ip::tcp::socket 作为 shared_ptr

如何将 boost::asio::tcp::io_stream 附加到我的 io_service?