gpt4 book ai didi

c# - 以正确的字节顺序发送 UDP 数据包

转载 作者:行者123 更新时间:2023-12-04 12:07:09 27 4
gpt4 key购买 nike

我无法理解网络字节顺序以及通过 UDP 发送和接收数据的顺序。我正在使用 C#。
我有一个结构保持:

message.start_id         = 0x7777CCCC;
message.message _id = 0xBBB67000;
more data
消息定义有 [StructLayout(LayoutKind.Sequential)] .我首先使用以下方法将结构转换为字节数组:
public byte[] StructureToByteArray(object obj)
{
int len = Marshal.SizeOf(obj);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
然后我检查字节序:
if (BitConverter.IsLittleEndian)
{
Array.Reverse(packet);
}
然后我发送
socket.SendTo(packet, endPoint);
当我发送此消息时,接收端会收到应用了正确字节序的消息,但字节顺序相反,因此在wireshark中查看我得到:
其余......................BBB67000 7777CCCC
当我期待: 7777CCCC BBB67000 ...................其余的。
我的期望是正确的还是结构中的第一个字节最后一个到达是正常的?

最佳答案

I’m having trouble understanding network byte ordering and the order in which data is sent and received over UDP



数据通过 UDP 完全按照给定套接字的字节顺序发送和接收。您只发送或接收字节数组,UDP 根本不会对数据报中的字节进行重新排序。

那么问题来了,如何处理字节序呢?

嗯,在很多情况下,答案是“没有”。一方面,您今天将遇到的大多数计算机都运行 x86 架构并且始终使用小端。在许多情况下,您无论如何都可以控制两端,因此可以始终坚持其中之一。如果您的 API 有办法将事物与字节流相互转换,那么您可以直接使用 UDP 套接字发送和接收这些字节。

但是,是的,有时您需要能够以与运行程序的体系结构 native 支持的字节序不同的字节序来处理数据传输。

在您的特定示例中,您似乎选择使用 big-endian 作为您的协议(protocol)的字节顺序(我从一小段代码中推断出这一点……如果没有 a good Minimal, Complete, and Verifiable example 就不可能确定)。哪个很好;原始的 BSD 套接字 API 包括“网络字节顺序”的概念,即大端。套接字库包括要转换的函数,例如从“主机顺序”到“网络顺序”再返回的 16 位整数。

但重要的是要了解字节序会在数据中每个单独的原语级别影响您的数据。你不能一次反转整个字节数组,因为如果你这样做,不仅会改变每个基元的字节顺序,还会改 rebase 元本身的顺序。果然,您在 Wireshark 跟踪中看到了这一点:数据结构中的两个字段的顺序已交换。

要正确处理字节顺序,您必须遍历数据结构的每个字段并单独交换字节。你会留下字节, short值(16 位)将交换它们的字节对, int值(32 位)将反转其四字节序列, long值(64 位)将反转八个字节,依此类推。

更复杂的是,一些数据结构根本不受字节序的影响(例如 UTF8 编码的文本),而其他数据结构则具有更复杂的规则(例如 Windows GUID/UUID,这是一个实际定义的 128 位值作为一个复杂的数据结构,具有多个不同大小的字段)。

要记住的重要一点是,字节序始终应用于每个单独的原始数据值级别,并考虑原始数据值使用的实际字节数。

关于c# - 以正确的字节顺序发送 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35774452/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com