【发布时间】:2017-08-22 09:29:26
【问题描述】:
数据发送到带有 boost::asio 的套接字的顺序是否完全得到保证?
也就是说,我正在多次调用
boost::asio::async_write(socket, buffer, completionHandler)
我看到一些奇怪的行为,客户端显然没有收到我认为我正在发送的数据,所以我想确保它正在做我希望它正在做的事情。请注意,我不是在等待在每次写入之间调用完成处理程序,我只是在触发一堆 async_write 调用并天真地期望数据以相同的顺序写入套接字。
asio 中的 strand 文档说:
如果存在与连接关联的单个异步操作链(例如,在 HTTP 等半双工协议实现中),则处理程序不可能并发执行。这是一条隐含的链。
我认为这意味着使用一个链不会改变任何东西,因为套接字提供了一个隐式链。
strand 文档通常讨论事件处理程序的严格顺序调用。但是我不清楚写入连接的数据是否会按照我调用 async_write 的顺序写入。
数据写入套接字的顺序是否有保证?
【问题讨论】:
-
这取决于底层协议。您使用的是 TCP 还是 UDP?如果您使用 TCP,您调用
async_write的顺序将是另一端接收数据的顺序。如果数据已损坏(使用 TCP 套接字),那么其他地方还有另一个问题。您要发送什么样的数据?你是怎么收到的?如何检查其有效性? -
另外,如果您使用 TCP,请记住它是一个 流 协议,没有固定大小的数据包或消息边界。接听电话可能给您少于 比您预期,或多于一个“消息”。您需要自己处理拆分成单独的消息或数据包。
-
另一方面,如果您使用 UDP,则可能会丢失数据包,或者以错误的顺序接收数据包。
-
@Someprogrammerdude 是的,抱歉,应该澄清一下。 TCP,我只是在发送数据时将数据转储到文件中,然后在收到数据时转储数据。我对套接字编程很有经验,但我只是想解释为什么我在使用我不太熟悉的 asio 时显然没有收到我发送的内容。我想(双重)检查 asio 保证数据按照我调用 async_write 的顺序发送到连接
标签: c++ boost-asio