【问题标题】:how to fragment packets in c++?如何在 C++ 中对数据包进行分段?
【发布时间】:2020-03-25 06:46:51
【问题描述】:

我一直在我的项目中实现 MSEX CITP 协议 - 到目前为止取得了成功 - 在我的项目中通过网络传输图像。我正在像这样使用winsocks:

v_id = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(v_id, SOL_SOCKET, SO_BROADCAST, (char*)&isbroad, sizeof(isbroad));
sendto(v_id, temp_buf, v_buffer->o(), 0, address->get(), socksize);

但对于大于 65k 的图像,规范规定我必须对数据包进行分段并添加给定的“前导码”。

经过一些研究,据我了解,我必须设置 MTU 大小和片段标头,但我所有的尝试都失败了。有人能指出我正确的方向吗?

【问题讨论】:

    标签: c++ fragment packet


    【解决方案1】:

    MTU 表示Maximum Transmission Unit :它表示可以在一个网络事务中发送/接收的最大PDU(协议数据单元)的大小(以太网通常为1500字节)。

    在您的情况下,很明显您的数据大小将大大超过 MTU 的大小。因此,您必须将文件分成几个片段发送。

    这个约束迫使你明确地管理:

    1.片段的sending/receiving
    2.concatenating的原始文件的reconstructioncorrect order中的不同片段

    要识别和管理您的片段,您必须将标头作为meta-data 添加到您的数据包中。此标头包含例如片段的大小和序列号:

    ---------------------------  
    | headers |       data    |
    ---------------------------  
    

    感谢这些标头,您将知道要读取的数据大小、片段的序列号。什么可以让你重建你的形象。

    【讨论】:

    • 嘿谢谢你的回答。我真的不需要接收,因为我只是发送,但我想这不是重点。但我的问题实际上是更明确的,我应该使用哪些 c++ 函数或选项来添加这些标头/元数据?
    • @user1906731 标头不是这个词通常表示的协议字段。这是您在构建包(使用 memcpy 或其他变体..)时显式注入(在缓冲区中)的数据。它们被放置在您的包的数据区域的开头,与您的图像数据混合。但是要注意,发送端和接收端必须就headers的大小达成一致,否则接收端会将headers解释为图像数据!
    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 2017-11-25
    • 2014-12-26
    • 2016-10-22
    • 2021-11-17
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多