首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::asio::async_write_some -顺序函数调用

boost::asio::async_write_some -顺序函数调用
EN

Stack Overflow用户
提问于 2021-06-15 19:38:37
回答 1查看 231关注 0票数 1

我正在使用boost.asio编写一个应用程序。我有一个boost::asio::ip::tcp::socket类型的对象,(当然)我只从一个线程调用了boost::asio::io_context,而run的函数是从一个线程调用的。

代码语言:javascript
运行
复制
void tcp_connection::write(packet_ptr packet)
{
    m_socket.async_write_some(boost::asio::buffer(packet->data(), packet->size()),
                              std::bind(&tcp_connection::on_write, this, std::placeholders::_1, std::placeholders::_2, packet));
}

boost::asio名称空间中还有另一个函数-- async_writeasync_write的文档显示:

此操作是以对流的async_write_some函数的零调用或多次调用来实现的,称为组合操作。在此操作完成之前,程序必须确保流不执行其他写操作(如async_write、流的async_write_some函数或执行写入的任何其他组合操作)。

async_write_some的文档中,没有这样的“谨慎”。

这让我有点困惑,这里我有以下几个问题:

  1. 在不等待上一次调用结束的情况下调用async_write_some安全吗?据我所知,从boost的文档中,我不应该使用async_write来实现这一点,但是async_write_some怎么办?
  2. 如果是,数据写入套接字的顺序是否与调用函数的顺序相同?我的意思是,如果我调用async_write_some(packet1)async_write_some(packet2),那么数据包是否将以相同的顺序写入套接字?
  3. 我应该使用哪种功能?他们之间有什么区别?
  4. 在上一次调用尚未完成时,调用async_write是不安全的原因是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 20:32:54

  1. 没有;原因可能是基础套接字API (BSD/WinSock)记录的。
  2. 不适用。请注意,调用处理程序的顺序保证与它们发布的顺序相匹配,因此您可以使用异步async_write_some调用链来解决这个问题,完成处理程序将在其中发布下一个写操作。这就是所谓的隐式链(参见asio/概述/核心/异步.core为什么在使用boost::asio时每个连接都需要串?)。
  3. 99%的时间,使用免费的功能。不同之处在于,它实现了组合操作,以发送信息的“单元”,即整个缓冲区、消息,或者直到满足给定的完成条件。 async_write_some是最低级别的构建块,它甚至不能保证写入所有数据:备注: 写入操作不能将所有数据发送给对等方。如果需要确保在异步操作完成之前写入所有数据,请考虑使用async_write函数。
  4. 从严格意义上讲,这并不是不安全的。这不会导致正确的结果:这是因为调用处理程序的顺序导致数据以混合顺序写入套接字。

1(除非您不同步地同时访问共享的IO对象)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67992478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档