什么时候Boost.Asio调用async_read_some回调?

时间:2014-05-29 17:51:15

标签: c++ sockets boost tcp

假设我有一个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.

1 个答案:

答案 0 :(得分:1)

async_read_some的{​​{3}}非常明确:

  

<强> 说明

     

读取操作可能无法读取所有请求的字节数。   如果您需要确保使用documentation功能,请考虑使用   在异步操作之前读取请求的数据量   完成。

TCP是基于流的协议,您需要在应用层处理消息帧。这在很大程度上取决于您的协议,您的方案中的一个可能的解决方案可能是null终止每个消息。或者,在每条消息之前包含一个固定的字节标头,指示有效负载的长度。