mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
81 lines
2.7 KiB
C#
81 lines
2.7 KiB
C#
using System;
|
|
|
|
namespace Cosmos.Sys.Network.TCPIP.UDP
|
|
{
|
|
internal class UDPPacket : IPPacket
|
|
{
|
|
protected UInt16 sourcePort;
|
|
protected UInt16 destPort;
|
|
protected UInt16 udpLen;
|
|
protected UInt16 udpCRC;
|
|
|
|
internal UDPPacket(byte[] rawData)
|
|
: base(rawData)
|
|
{}
|
|
|
|
internal UDPPacket(IPv4Address source, IPv4Address dest, UInt16 srcPort, UInt16 destPort, byte[] data)
|
|
: base((UInt16)(data.Length+8), 17, source, dest)
|
|
{
|
|
mRawData[this.dataOffset + 0] = (byte)((srcPort >> 8) & 0xFF);
|
|
mRawData[this.dataOffset + 1] = (byte)((srcPort >> 0) & 0xFF);
|
|
mRawData[this.dataOffset + 2] = (byte)((destPort >> 8) & 0xFF);
|
|
mRawData[this.dataOffset + 3] = (byte)((destPort >> 0) & 0xFF);
|
|
udpLen = (UInt16)(data.Length + 8);
|
|
mRawData[this.dataOffset + 4] = (byte)((udpLen >> 8) & 0xFF);
|
|
mRawData[this.dataOffset + 5] = (byte)((udpLen >> 0) & 0xFF);
|
|
mRawData[this.dataOffset + 6] = 0;
|
|
mRawData[this.dataOffset + 7] = 0;
|
|
for (int b = 0; b < data.Length; b++)
|
|
{
|
|
mRawData[this.dataOffset + 8 + b] = data[b];
|
|
}
|
|
|
|
initFields();
|
|
}
|
|
|
|
protected override void initFields()
|
|
{
|
|
base.initFields();
|
|
sourcePort = (UInt16)((mRawData[this.dataOffset] << 8) | mRawData[this.dataOffset + 1]);
|
|
destPort = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]);
|
|
udpLen = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]);
|
|
udpCRC = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]);
|
|
}
|
|
|
|
internal UInt16 DestinationPort
|
|
{
|
|
get { return this.destPort; }
|
|
}
|
|
internal UInt16 SourcePort
|
|
{
|
|
get { return this.sourcePort; }
|
|
}
|
|
internal UInt16 UDP_Length
|
|
{
|
|
get { return this.udpLen; }
|
|
}
|
|
internal UInt16 UDP_DataLength
|
|
{
|
|
get { return (UInt16)(this.udpLen - 8); }
|
|
}
|
|
internal byte[] UDP_Data
|
|
{
|
|
get
|
|
{
|
|
byte[] data = new byte[this.udpLen - 8];
|
|
|
|
for (int b = 0; b < data.Length; b++)
|
|
{
|
|
data[b] = this.mRawData[this.dataOffset + 8 + b];
|
|
}
|
|
|
|
return data;
|
|
}
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return "UDP Packet Src=" + sourceIP + ":" + sourcePort + ", Dest=" + destIP + ":" + destPort + ", DataLen=" + UDP_DataLength;
|
|
}
|
|
}
|
|
}
|