可以说我有一个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_somedocumentation非常清楚:


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


TCP是基于流的协议,您将需要在应用程序层处理消息帧。这在很大程度上取决于您的协议,在您的方案中,一种可能的解决方案可能是使每个消息都为空。或者,在每个指示有效载荷长度的消息之前包括一个固定的字节头。

关于c++ - Boost.Asio什么时候调用async_read_some回调?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23939718/

10-13 06:30