我正在使用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)?或者,如果我在回调函数中发送下一个数据包,它会工作吗?
如果这个事实有效,另一个问题就是订购。我可以确定订单(到达客户端的数据包)与我从服务器发送的订单相同吗?
答案 0 :(得分:5)
首先,TCP套接字对数据流而不是数据包进行操作。其次,async_write()
documentation明确指出每个套接字的单个未完成操作可以在飞行中:
此操作是根据对零的或多个调用实现的 stream的
async_write_some
函数,被称为组合 操作。程序必须确保流不执行任何其他操作 写操作(例如async_write
,流的async_write_some
函数或执行写入的任何其他组合操作直到 此操作完成。
您需要链接您的操作:仅在调用第一个操作的完成处理程序后调用第二个async_write()
。