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
会不会变成非阻塞函数呢?因此我们可能会调用多个send
s,从而导致乱序交付。以上是关于boost async_write() 和 non_blocking socket.send() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
如何使用超时创建 boost::async_read 和 async_write
boost asio async_write:如何不交错 async_write 调用?