【问题标题】:boost::asio packet order and contiguityboost::asio 数据包顺序和连续性
【发布时间】:2013-01-19 01:06:56
【问题描述】:

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

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

【问题讨论】:

    标签: c++ boost tcp boost-asio


    【解决方案1】:

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

    这个操作是在零次或多次调用 流的async_write_some 函数,被称为组合 手术。程序必须确保流不执行其他 写操作(如async_write,流的async_write_some 函数或任何其他执行写入的组合操作)直到 此操作完成。

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

    【讨论】:

    • 好的,我看到了这个问题。但另一方面,这是否意味着在回调函数中调用下一个 async_write 就足以确保客户端的数据包连续性和顺序?
    • @Haatschii 这正是我的回答所表明的。
    • 没问题,如果您有其他问题,请随时提出。 Boost.Asio 库一开始有点复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多