假设我有一个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.
答案 0 :(得分:1)
async_read_some
的{{3}}非常明确:
<强> 说明 强>
读取操作可能无法读取所有请求的字节数。 如果您需要确保使用documentation功能,请考虑使用 在异步操作之前读取请求的数据量 完成。
TCP是基于流的协议,您需要在应用层处理消息帧。这在很大程度上取决于您的协议,您的方案中的一个可能的解决方案可能是null终止每个消息。或者,在每条消息之前包含一个固定的字节标头,指示有效负载的长度。