繁体   English   中英

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

[英]boost::asio packet order and contiguity

我正在使用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的appart)? 还是如果我在回调函数中发送下一个数据包,它将起作用吗?

如果这一事实起作用,那么另一个问题就是有关订购的问题。 我可以确定数据包到达客户端的顺序与我从服务器发送的顺序相同吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM