2014-03-28 26 views
0

我想發送一個UDP分組,其具有以下結構在C#自定義的UDP數據包結構

  1. 分組大小爲UINT16數據類型的8個字節
  2. 頭字段UINT16數據類型
  3. 命令字段UINT32數據類型的
  4. 號碼字段

我設計的分組方式如下:

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); 

有沒有更好的方法來做同樣的事情?

回答

3

你可以使用BitConverter如:

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

這看起來簡短而乾淨。非常感謝... –

1

你也可以使用.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; } 

這兩項解決方案將編碼的領域與當地機器的排序,然而。這對你來說可能是也可能不是問題。