2

我正在使用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 大小)?或者如果我在回调函数中发送下一个数据包,它会起作用吗?

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

4

1 回答 1

5

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

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

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

于 2013-01-18T17:02:04.523 回答