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

Haa*_*hii 2 c++ boost tcp boost-asio

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

 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);
Run Code Online (Sandbox Code Playgroud)

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

uint32 size;
read(socket, buffer(&size,4));
char data[size];
read(socket, buffer(data,size));
Run Code Online (Sandbox Code Playgroud)

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

如果这个实际上有效,另一个问题是关于排序.我可以确定数据包到达客户端的顺序与我从服务器发送的顺序相同吗?

Sam*_*ler 5

首先,TCP套接字在数据流上运行,而不是数据包.其次,async_write()文档明确指出每个插槽的单个未完成操作可以在飞行中:

该操作是根据对流的async_write_some函数的零次或多次调用来实现的,并且被称为组合操作.程序必须确保流不执行其他写操作(例如async_write,流的async_write_some 功能或执行写操作的任何其他组合操作),直到此操作完成.

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