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,源地址和目的地址可能不同 } } }
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); }