コード例 #1
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,源地址和目的地址可能不同
                }
            }
        }
コード例 #2
0
        private void ParseUdpHeader(byte[] udpBytes, int offset, uint srcAddr, uint dstAddr)
        {
            UDP_HEADER udpHeader = ProtocolParseHelper.GetUdpHeader(udpBytes, offset);

            if (null == udpHeader)
            {
                throw new ArgumentException();
            }

            int         udpDataLen = udpBytes.Length - offset - udpHeader.Len;
            UdpDataInfo udpData    = new UdpDataInfo(udpDataLen)
            {
                SrcAddr = srcAddr,
                DstAddr = dstAddr,
                SrcPort = udpHeader.src_port,
                DstPort = udpHeader.des_port
            };

            Buffer.BlockCopy(udpBytes, offset + udpHeader.Len, udpData.UdpDataBytes, 0, udpDataLen);

            ParseUdpData(udpData);
        }