[英]when does Boost.Asio call async_read_some callbacks?
可以说我有一个Boos.Asio TCP客户端,它可以发送一个字符串,如下所示:
client.sendStr("1111");
我也有一个异步Boost.Asio TCP服务器,它将处理传入的数据包并进行打印,如下所示:
received string: "1111", size: 5.
问题是,当我多次调用client.sendStr()
,像这样
client.sendStr("1111");
client.sendStr("2222");
client.sendStr("3333");
我可能会在服务器端得到各种结果,例如:
received string: "1111", size: 5.
received string: "2222", size: 5.
received string: "2222", size: 5.
要么
received string: "111122223333", size: 13.
要么
received string: "11112222", size: 9.
received string: "3333", size: 5.
我是网络新手,但我想这种情况的原因是TCP是“基于流的协议”。
我的问题是:
1)我可以阻止Boost.Asio这样做吗? (让我们说“ 1111”和“ 2222”是我的应用程序的控制数据包,但我没有连接它们)。
2)有没有可能我会收到这样的回调:
received string: "111122", size: 7.
received string: "22333", size: 6.
received string: "3", size: 2.
async_read_some
的文档非常清楚:
备注
读取操作可能无法读取所有请求的字节数。 如果需要确保在异步操作完成之前读取请求的数据量,请考虑使用
async_read
函数。
TCP是基于流的协议,您将需要在应用程序层处理消息帧。 这在很大程度上取决于您的协议,在您的方案中,一种可能的解决方案可能是使每个消息都为空。 或者,在每个指示有效载荷长度的消息之前包括一个固定的字节头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.