当前位置:  开发笔记 > 编程语言 > 正文

UDP传输和维护网络字节顺序

如何解决《UDP传输和维护网络字节顺序》经验,为你挑选了1个好方法。

所以我在通过C++中的客户端 - 服务器程序发送和接收自定义数据包时遇到了一些麻烦.我已经使用TCP实现了类似的功能,但是在使用UDP时,我遇到了将所有内容转换为单个数据报的问题.

目前我的头部由偶数个uint32_t字段组成.其中每个都以网络顺序存储,如下所示:

 uint32_t x = htonl (int y);

...

我正在将报头与数据包中的有效负载结合起来,如下所示:

 typedef struct {
    450Header header; // 512 bytes consisting of the unint32_t like above
    char data[ BLOCKSIZE ];  // 3.5k
    // Total Packet Size = 4k
} Packet;

"

标题部分将包含有关数据包的信息,我的问题是如何处理字符串和有效负载的字节顺序.我非常喜欢一些字符串字段添加到搞什么名头,如果我派比数据包中的块大小,我想它分成多个包大的文件,我需要知道如何分割文件,因此可以按正确的顺序解释接收端.

    我已经成功地独立构建了一个标题(所有字段都按网络字节顺序排列),如果我将它们添加到标题中,是否还需要转换字符串的顺序?我假设如果我将字符串保持在设定的大小,我仍然可以为标题编写校验和函数.

    如果从问题1中正确排序所有内容,我是否需要在接收端再次将它们转换回主机订单?

    我有一个mmap函数,它将文件加载到char缓冲区中,我可以简单地使用memcpy和递增偏移量这样一块一块地复制到Packet中的数据缓冲区吗?或者我是否还要担心有效载荷数据的网络顺序?

    我是否需要对有效负载使用校验和?如果它不使用整个缓冲区并以奇数个字节结束,我该怎么办呢?

最后,我想报头包含序列号,所以我可以练习执行程序,如果数据包被丢弃(即回N),所以我现在最担心的是规范中,一切都从客户端发送的,因此它可以被理解的顺序在服务器端以正确的顺序.



1> Remy Lebeau..:

8位数据(包括8位整数,Ansi/UTF-8字符串等)不会受到字节顺序问题的影响,因此您可以按原样发送/接收它们.只需要处理字节排序的多字节数据(如16位/ 32位整数,16位UCS2/UTF-16字符串等).例如,整数应始终采用网络字节顺序,但UTF-16字符串可以自行决定使用UTF-16LE或UTF-16BE(尽管您应该使用UTF-8).

如果必须将数据拆分为多个包,则需要将信息放入数据包标头中以指定数据包的顺序.UDP不保证数据包的到达顺序与它们发送的顺序相同,甚至不保证数据包到达.因此,接收器需要收集数据包(根据需要请求丢失数据包),然后在处理数据之前对其进行相应的重新排序.

是的,您应该始终在发送数据包之前将数据包转换为网络字节顺序,并在接收端处理它们时转换回主机字节顺序.转换为网络字节顺序仅用于传输目的,以确保跨平台的格式一致.

校验和是确保每个数据包的数据完整性的好主意,但这不是必需的.您可以确定为任意长度的数据提供固定长度的校验和,有很多校验和算法可以支持它.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有