// adaptation from http://www.netfor2.com/udpsum.htm private ushort GetUDPChecksum() { UInt32 sum = 0; for (uint i = this.start; i < this.start + 6; i += 2) { sum += (UInt32)(data->m_IBuffer[i] << 8) | data->m_IBuffer[i + 1]; } for (uint i = this.start + 8; i < TotalLength + base.LayerStart() - 1; i += 2) { sum += (UInt32)(data->m_IBuffer[i] << 8) | data->m_IBuffer[i + 1]; } if (((TotalLength + base.LayerStart()) % 2) == 1) { sum += (UInt32)(data->m_IBuffer[TotalLength + base.LayerStart() - 1] << 8); } // src addr byte[] srcB = SourceIP.GetAddressBytes(); for (int i = 0; i < 4; i += 2) { sum += (UInt32)(((srcB[i] << 8) & 0xFF00) | (srcB[i + 1] & 0xFF)); } // dst addr byte[] destB = DestIP.GetAddressBytes(); for (int i = 0; i < 4; i += 2) { sum += (UInt32)(((destB[i] << 8) & 0xFF00) | (destB[i + 1] & 0xFF)); } // proto sum += 0x00011; // length sum += ((UInt16)(TotalLength - (base.LayerLength()))); // 1's compliment while ((sum >> 16) != 0) { sum = ((sum & 0xFFFF) + (sum >> 16)); } sum = ~sum; return((ushort)sum); }
public byte[] ToBytes() { Checksum = 0; byte[] header = new byte[IHL * 4]; header[0] = (byte)((Version << 4) | IHL); header[1] = (byte)((DSCP << 2) | ECN); header[2] = (byte)(TotalLength >> 8); header[3] = (byte)(TotalLength & 0xFF); header[4] = (byte)(Id >> 8); header[5] = (byte)(Id & 0xFF); header[6] = (byte)((Flags << 5) | (FragmentOffset >> 8)); header[7] = (byte)(FragmentOffset & 0xFF); header[8] = (byte)TTL; header[9] = (byte)Protocol; header[10] = (byte)(Checksum >> 8); header[11] = (byte)(Checksum & 0xFF); int[] ip = SourceIP.Split('.').Select(int.Parse).ToArray(); header[12] = (byte)ip[0]; header[13] = (byte)ip[1]; header[14] = (byte)ip[2]; header[15] = (byte)ip[3]; ip = DestIP.Split('.').Select(int.Parse).ToArray(); header[16] = (byte)ip[0]; header[17] = (byte)ip[1]; header[18] = (byte)ip[2]; header[19] = (byte)ip[3]; long sum = 0; for (int i = 0; i < IHL * 4; i += 2) { sum += ((header[i] << 8) & 0xFF00) + (header[i + 1] & 0xFF); } while ((sum >> 16) != 0) { sum = (sum & 0xFFFF) + (sum >> 16); } Checksum = (ushort)(~sum); header[10] = (byte)(Checksum >> 8); header[11] = (byte)(Checksum & 0xFF); return(header); }
public override int GetHashCode() { return(SrcIP.GetHashCode() + DestIP.GetHashCode()); }