boost async_write() 和 non_blocking socket.send() 之间的区别

Posted

技术标签:

【中文标题】boost async_write() 和 non_blocking socket.send() 之间的区别【英文标题】:Difference between boost async_write() and non_blocking socket.send() 【发布时间】:2016-02-28 10:32:12 【问题描述】:

'因为我们可以通过它的成员函数non_blocking(true)将一个套接字设置为非阻塞状态。

async_write(socket, buffer) 和 non_blocking socket.send(buffer) 有什么区别吗?

多个socket.send(buffer) 是否会像async_write(socket, buffer) 一样导致无序数据传输?

【问题讨论】:

【参考方案1】:

send 不保证所有数据都已写入套接字。您应该检查“字节写入”返回值、错误代码等。另一方面,async_write 将尝试发送,直到所有数据都发送完毕或发生错误。

来自ip::tcp::send手册的备注:

发送操作可能不会将所有数据传输到对等方。 如果您需要确保所有数据都被写入,请考虑使用写入功能 在阻塞操作完成之前写入。

【讨论】:

谢谢。多个socket.send(buffer) 是否会导致乱序数据传输,就像async_write(socket, buffer) 一样? @StephenW 不,send 不能这样做,因为它的一步法和async_write 不是。注意send 无论如何都可以这样做,如果你忽略它的返回值 =) 即使send也是一步法,既然我们将socket设置为非阻塞状态,那么send会不会变成非阻塞函数呢?因此我们可能会调用多个sends,从而导致乱序交付。

以上是关于boost async_write() 和 non_blocking socket.send() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何使用超时创建 boost::async_read 和 async_write

boost asio async_write:如何不交错 async_write 调用?

boost::async_write 导致数据损坏

boost:asio::async_write:数据已发送但未调用处理程序

boost::async_write 在写入一段时间后失败

为啥 boost::asio::async_write 第一次运行良好,第二次出现问题?