Ejemplo n.º 1
0
        //这个地方必须保证不为奇数长度
        //这个地方在于求和要按照网络字节序
        //求出的结果是按照本机字节序解释的,写入还要转换
        //假如是校验的话,结果是零的话不论字节序如何应该都一样?
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        public void CalculationHeaderChecksum()
        {
            _IPHeader64_96._HeaderChecksum = 0;

            _IPHeader64_96._HeaderChecksum = Meth.AsBigEndian(Meth.CalculationHeaderChecksum(ref this));
        }