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 可以重用?