asio::tcp::socket 的 async_read_some 和 async_receive 有啥区别?

Posted

技术标签:

【中文标题】asio::tcp::socket 的 async_read_some 和 async_receive 有啥区别?【英文标题】:What is the difference between asio::tcp::socket's async_read_some and async_receive?asio::tcp::socket 的 async_read_some 和 async_receive 有什么区别? 【发布时间】:2011-01-15 08:10:54 【问题描述】:

有什么区别:

boost::asio::tcp::socket::async_read_some() boost::asio::tcp::socket::async_receive()

据我所知,他们的文档是相同的。

我应该更喜欢哪个?

【问题讨论】:

【参考方案1】:

我相信这两者本质上是相同的。它们提供两者的原因是提供类似于 iostream(具有 read_some 成员)和套接字(具有 receive)的接口。

正如 Peter Tseng 所指出的,async_receive 也确实有一个接受 socket_base::message_flags 的重载,而 async_read_some 不接受。

【讨论】:

对我来说很有意义。所以我想他应该“更喜欢”与他宁愿保持兼容性的界面匹配的那个。 async_receive 接受 socket_base::message_flags 值得一提 @PeterTseng:提到这就是为什么我刚刚投票赞成(显然,你的编辑)Adrien Clerc 的回答... :-)【参考方案2】:

networking TR2 proposal(5.7.10.2 basic_stream_socket 成员)中的规范也相同:

在 async_receive 上:

效果:调用 this->service.async_receive(this->implementation, buffers, 0, handler)。

在 async_read_some 上:

效果:调用 this->service.async_receive(this->implementation, buffers, 0, handler)。

所以我想这证实了杰瑞的印象。

【讨论】:

杰瑞的回答更好。给出一些理由why 这可能是这样。【参考方案3】:

在这里通过两个链接向大家确认:

    https://github.com/boostorg/asio/blob/36eef63a9cf8ae609716d76ccb3906ff9769d53a/include/boost/asio/basic_stream_socket.hpp#L558 https://github.com/boostorg/asio/blob/36eef63a9cf8ae609716d76ccb3906ff9769d53a/include/boost/asio/basic_stream_socket.hpp#L834

代码完全相同。然而,async_receive 有一个带有 message_flags 的重载,特别是允许您指定 asio::socket_base::message_peek

【讨论】:

以上是关于asio::tcp::socket 的 async_read_some 和 async_receive 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 boost::asio::tcp::socket 可以重用?

boost asio tcp socket 1.70 不向后兼容

ES6 之 async 异步函数

JS async和await关键字

async / await 的串行和并行

Dart 中的 async 和 async* 有啥区别?