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