/// <summary> /// Creates a new instance of this class by parsing the given data /// </summary> /// <param name="bData">The byte array to parse</param> public TCPFrame(byte[] bData) { int iDataOffset; //In bits. iSourcePort = bData[0] * 256 + bData[1]; iDestinationPort = bData[2] * 256 + bData[3]; iSequenceNumber = (uint)(bData[4] * (uint)(256 * 256 * 256) + bData[5] * (uint)(256 * 256) + bData[6] * (uint)256 + bData[7]); iAcknowledgmentNumber = (uint)(bData[8] * (uint)(256 * 256 * 256) + bData[9] * (uint)(256 * 256) + bData[10] * (uint)256 + bData[11]); iDataOffset = (int)((bData[12] & 0xF0) >> 4) * 4; if (iDataOffset < 20) { throw new ArgumentException("Invalid packet header"); } bUrgent = (bData[13] & 0x20) > 0; bAcknowledgement = (bData[13] & 0x10) > 0; bPush = (bData[13] & 0x8) > 0; bReset = (bData[13] & 0x4) > 0; bSynchronize = (bData[13] & 0x2) > 0; bFinish = (bData[13] & 0x1) > 0; iWindow = bData[14] * (uint)256 + bData[15]; bChecksum = new byte[2]; bChecksum[0] = bData[16]; bChecksum[1] = bData[17]; iUrgentPointer = bData[18] * (uint)256 + bData[19]; byte[] bOptions = new byte[iDataOffset - 20]; for (int iC1 = 20; iC1 < iDataOffset; iC1++) { bOptions[iC1 - 20] = bData[iC1]; } this.oOptions = new TCPOptions(bOptions); byte[] bEncapsulatedData = new byte[bData.Length - iDataOffset]; for (int iC1 = iDataOffset; iC1 < bData.Length; iC1++) { bEncapsulatedData[iC1 - iDataOffset] = bData[iC1]; } this.fEncapsulatedFrame = new RawDataFrame(bEncapsulatedData); }
/// <summary> /// Creates a new empty instance of this class /// </summary> public TCPFrame() { iSourcePort = 0; iDestinationPort = 0; iSequenceNumber = 0; iAcknowledgmentNumber = 0; bUrgent = false; bAcknowledgement = false; bPush = false; bReset = false; bSynchronize = false; bFinish = false; iWindow = 0; bChecksum = new byte[2]; iUrgentPointer = 0; oOptions = new TCPOptions(); fEncapsulatedFrame = null; }