//这个地方必须保证不为奇数长度 //这个地方在于求和要按照网络字节序 //求出的结果是按照本机字节序解释的,写入还要转换 //假如是校验的话,结果是零的话不论字节序如何应该都一样? static uint AddSpanBytesSum(Span <byte> buffer) { var vs = MemoryMarshal.Cast <byte, ushort>(buffer); uint sum = 0; foreach (var item in vs) { sum += Meth.AsBigEndian(item); } if ((buffer.Length % sizeof(ushort)) != 0) { uint n = buffer[buffer.Length - 1]; sum += n << 8; } return(sum); }
public static void Set( ref TCPHeader header, IPv4Address sourceAddress, ushort sourcePort, IPv4Address desAddress, ushort desPort, Span <byte> headerAndData) { header._SourcePort = Meth.AsBigEndian(sourcePort); header._DesPort = Meth.AsBigEndian(desPort); var ph = new PseudoHeader( sourceAddress, desAddress, Protocol.TCP, (ushort)headerAndData.Length); header._Checksum = 0; header._Checksum = Meth.AsBigEndian(Meth.CalculationHeaderChecksum(ph, headerAndData)); }
public static void Set( ref TCPHeader header, IPv4Address sourceAddress, ushort sourcePort, IPv4Address desAddress, ushort desPort, TCPFlag tcpFlag, ushort windowSize, uint sequenceNumber, uint acknowledgmentNumber, Span <byte> headerAndData) { header = new TCPHeader(); header._SourcePort = Meth.AsBigEndian(sourcePort); header._DesPort = Meth.AsBigEndian(desPort); header._SequenceNumber = Meth.AsBigEndian(sequenceNumber); header._AcknowledgmentNumber = Meth.AsBigEndian(acknowledgmentNumber); header._WindowSize = Meth.AsBigEndian(windowSize); header._TCPHeader12_14._Byte_0 = (byte)(5 << 4); header._TCPHeader12_14._Byte_1 = (byte)tcpFlag; var ph = new PseudoHeader( sourceAddress, desAddress, Protocol.TCP, (ushort)headerAndData.Length); header._Checksum = Meth.AsBigEndian(Meth.CalculationHeaderChecksum(ph, headerAndData)); }
public void CalculationHeaderChecksum() { _IPHeader64_96._HeaderChecksum = 0; _IPHeader64_96._HeaderChecksum = Meth.AsBigEndian(Meth.CalculationHeaderChecksum(ref this)); }