Exemple #1
0
        public static IP_HEADER GetIpHeader(byte[] frameData)
        {
            IP_HEADER ipHeader = new IP_HEADER();

            if (-1 == ipHeader.DeserializeToStruct(frameData, Marshal.SizeOf <ETHERNET_HEADER>()))
            {
                return(null);
            }

            return(ipHeader);
        }
Exemple #2
0
        public void ParseIpFrameData(byte[] frameDataBytes)
        {
            IP_HEADER ipHeader = ProtocolParseHelper.GetIpHeader(frameDataBytes);

            if (null == ipHeader)
            {
                return;
            }

            byte protocolType = ipHeader.protocol;

            if (ProtocolType.UDP != (ProtocolType)protocolType)
            {
                return;
            }

            int offset = ipHeader.headerLen + Marshal.SizeOf <ETHERNET_HEADER>();

            if (0 == ipHeader._flag && 0 == ipHeader._offset)               //当分片标志为0,而偏移值也为0时,表示没有分片,不进行组包处理;
            {
                ParseUdpHeader(frameDataBytes, offset, ipHeader.src_addr, ipHeader.des_addr);
            }
            else
            {
                int dataLen = frameDataBytes.Length - offset;
                var ipData  = new byte[dataLen];
                Buffer.BlockCopy(frameDataBytes, offset, ipData, 0, dataLen);
                AddNewIpPacket(ipHeader.id, ipHeader._offset, ipData);       //UDP报文太大,产生了分片,需要保存数据

                if (0 == ipHeader._flag)                                     //最后一个分片,所有的数据组装成UDP数据报,再进行解析
                {
                    var udpData = IpBurst(ipHeader.id);
                    if (null == udpData)
                    {
                        throw new ApplicationException();
                    }

                    ParseUdpHeader(udpData, 0, ipHeader.src_addr, ipHeader.des_addr);                       //TODO 这里需要判断是否是不同的ipHeader,源地址和目的地址可能不同
                }
            }
        }