diff --git a/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj b/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj index 46ac95398..896f97886 100644 --- a/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj +++ b/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj @@ -49,6 +49,7 @@ + diff --git a/source/Cosmos/Cosmos.System/Network/IP4Packet.cs b/source/Cosmos/Cosmos.System/Network/IP4Packet.cs new file mode 100644 index 000000000..8d0648fd6 --- /dev/null +++ b/source/Cosmos/Cosmos.System/Network/IP4Packet.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Cosmos.Sys.Network { + public abstract class IP4Packet : Packet { + protected int mHeaderSize = 20; + protected int mHeaderBegin; + + protected override int Initialize(byte[] aData, int aHeaderSize) { + mHeaderBegin = base.Initialize(aData, mHeaderSize + aHeaderSize); + return mHeaderBegin; + } + } +} diff --git a/source/Cosmos/Cosmos.System/Network/Packet.cs b/source/Cosmos/Cosmos.System/Network/Packet.cs index 7fd50997f..bb3541063 100644 --- a/source/Cosmos/Cosmos.System/Network/Packet.cs +++ b/source/Cosmos/Cosmos.System/Network/Packet.cs @@ -11,16 +11,17 @@ namespace Cosmos.Sys.Network { // user that it is not a direct access, but incurs a performance // penalty to call public byte[] GetData() { - Finalize(); + Conclude(); return mData; } - protected void Initialize(byte[] aData, int aHeaderSize) { + protected virtual int Initialize(byte[] aData, int aHeaderSize) { mData = new byte[aData.Length + 8]; aData.CopyTo(mData, 8); + return 0; } - protected virtual void Finalize() { + protected virtual void Conclude() { } } } diff --git a/source/Cosmos/Cosmos.System/Network/UDPPacket.cs b/source/Cosmos/Cosmos.System/Network/UDPPacket.cs index 971cbce13..0ae653ea2 100644 --- a/source/Cosmos/Cosmos.System/Network/UDPPacket.cs +++ b/source/Cosmos/Cosmos.System/Network/UDPPacket.cs @@ -5,26 +5,28 @@ using System.Text; namespace Cosmos.Sys.Network { // http://en.wikipedia.org/wiki/User_Datagram_Protocol - public class UDPPacket : Packet { + public class UDPPacket : IP4Packet { public UDPPacket(int aSrcPort, int aDestPort, byte[] aData) { - Initialize(aData, 8); + mHeaderBegin = Initialize(aData, 8); // Source Port - mData[0] = (byte)(aSrcPort >> 8); - mData[1] = (byte)(aSrcPort & 0xFF); + mData[mHeaderBegin] = (byte)(aSrcPort >> 8); + mData[mHeaderBegin + 1] = (byte)(aSrcPort & 0xFF); // Destination Port - mData[2] = (byte)(aDestPort >> 8); - mData[3] = (byte)(aDestPort & 0xFF); + mData[mHeaderBegin + 2] = (byte)(aDestPort >> 8); + mData[mHeaderBegin + 3] = (byte)(aDestPort & 0xFF); // Length - mData[4] = (byte)(mData.Length >> 8); - mData[5] = (byte)(mData.Length & 0xFF); + mData[mHeaderBegin + 4] = (byte)(mData.Length >> 8); + mData[mHeaderBegin + 5] = (byte)(mData.Length & 0xFF); } - protected override void Finalize() { - base.Finalize(); + protected new int mHeaderBegin = 0; + + protected override void Conclude() { + base.Conclude(); // Checksum //TODO: Uses info from IPHeader to create check sum as well - mData[6] = 0; - mData[7] = 0; + mData[mHeaderBegin + 6] = 0; + mData[mHeaderBegin + 7] = 0; } } }