【问题标题】:Custom UDP Packet structure in C#C#中的自定义UDP数据包结构
【发布时间】:2014-03-29 04:27:46
【问题描述】:

我想发送一个UDP数据包,结构如下

  1. 数据包大小为 8 个字节
  2. uint16数据类型的头域
  3. uint16 数据类型的命令字段
  4. uint32 数据类型的数字字段

我按照以下方式设计了数据包:

ushort header = (ushort)IPAddress.HostToNetworkOrder(0x0001);
ushort command = (ushort)IPAddress.HostToNetworkOrder(10);
uint number = (uint)IPAddress.HostToNetworkOrder(2);

byte[] requestPacket = new byte[8];
requestPacket[0] = (byte)(header >> 8 & 0xFF);
requestPacket[1] = (byte)(header & 0xFF);
requestPacket[2] = (byte)(command >> 8 & 0xFF);
requestPacket[3] = (byte)(command & 0xFF);
requestPacket[4] = (byte)(number >> 24 & 0xFF);
requestPacket[5] = (byte)(number >> 16 & 0xFF);
requestPacket[6] = (byte)(number >> 8 & 0xFF);
requestPacket[7] = (byte)(number & 0xFF);

是否有更好的方法来做上述相同的事情?

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    您可以使用BitConverter 例如:

    var headerBytes = BitConverter.GetBytes(header);
    Array.Copy(headerBytes, 0, requestPacket, 0, 2);
    

    【讨论】:

      【解决方案2】:

      您还可以使用 .NET 的内置编组功能或不安全代码:

      [StructLayout(LayoutKind.Sequential, Pack = 1)] // Ensure tight packing
      public struct Packet
      {
          public ushort Header;
          public ushort Command;
          public uint Number;
      }
      
      Packet packet = new Packet { ... };
      byte[] packetData = new byte[Marshal.Sizeof<Packet>()];
      
      // Using marshaling
      var handle = default(GCHandle);
      try
      {
          handle = GCHandle.Alloc(packetData, GCHandleType.Pinned);
          Marshal.StructureToPtr(packet, handle.AddrOfPinnedObject(), fDeleteOld: false);
      }
      finally
      {
          if (handle.IsAllocated) handle.Free();
      }
      
      // Using unsafe code (careful, assumes marshaled size == size in memory!)
      unsafe { fixed(byte* packedPtr = packetData) *(Packet*)packedPtr = packet; }
      

      不过,这两种解决方案都会使用本地机器字节序对您的字段进行编码。这对您来说可能是也可能不是问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 2013-08-30
        相关资源
        最近更新 更多