boost :: asio数据包顺序和连续性

时间:2013-01-18 16:55:22

标签: c++ boost tcp boost-asio

我正在使用boost::asio::ip::tcp::socket在客户端/服务器应用程序中发送和接收数据。我使用简单的自制数据包,包含一个包含数据包大小的标题加上一些标志和“真实”数据。 我使用boost::asio::write发送数据包。在某些情况下,我有很多数据包要发送到一个客户端。天真最快的选择是立刻发送它们。 E.g。

 async_write(socket, buffer(p[0].str(),p[0].size()), &callback);
 async_write(socket, buffer(p[1].str(),p[1].size()), &callback);
 async_write(socket, buffer(p[2].str(),p[2].size()), &callback);

但如果我这样做,是否可以保证我的数据包整体到达客户端?因此,在示例中,如果数据包的前4个字节表示剩余数据包的大小,我可以调用四次

uint32 size;
read(socket, buffer(&size,4));
char data[size];
read(socket, buffer(data,size));

并确保每个data包含一个数据包(来自uint32大小的appart)?或者,如果我在回调函数中发送下一个数据包,它会工作吗?

如果这个事实有效,另一个问题就是订购。我可以确定订单(到达客户端的数据包)与我从服务器发送的订单相同吗?

1 个答案:

答案 0 :(得分:5)

首先,TCP套接字对数据流而不是数据包进行操作。其次,async_write() documentation明确指出每个套接字的单个未完成操作可以在飞行中:

  

此操作是根据对零的或多个调用实现的   stream的async_write_some函数,被称为组合   操作。程序必须确保流不执行任何其他操作   写操作(例如async_write,流的async_write_some   函数或执行写入的任何其他组合操作直到   此操作完成。

您需要链接您的操作:仅在调用第一个操作的完成处理程序后调用第二个async_write()