我正在使用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);
但是如果我这样做,是否可以保证我的数据包作为一个整体到达客户端?所以在例子中如果数据包的前4个字节代表剩余数据包的大小,我可以调用四次吗
uint32 size;
read(socket, buffer(&size,4));
char data[size];
read(socket, buffer(data,size));
并确保每个都data
包含一个数据包(除了 uint32 大小)?或者如果我在回调函数中发送下一个数据包,它会起作用吗?
如果这个事实有效,另一个问题是关于排序。我可以确定到达客户端的数据包的顺序与我从服务器发送它们的顺序相同吗?