/// <summary> /// Пасинг записей из пакета /// </summary> /// <param name="Data">ссылка не массив байт пакета</param> /// <param name="start">позиция откуда выбирать следущию запись</param> /// <returns>Объект записи</returns> private RowNetFlow ParsingRow(ref byte[] Data, int start) { RowNetFlow ret = new RowNetFlow(); ret.srcaddr = RawToUInt(ref Data, start); // new byte[] { Data[start], Data[start + 1], Data[start + 2], Data[start + 3] }; //Data.Skip(start).Take(4).ToArray(); ret.dstaddr = RawToUInt(ref Data, start + 4); //new byte[] { Data[start + 4], Data[start + 5], Data[start + 6], Data[start + 7] }; //Data.Skip(start + 4).Take(4).ToArray(); ret.nexthop = RawToUInt(ref Data, start + 8); //new byte[] { Data[start + 8], Data[start + 9], Data[start + 10], Data[start + 11] }; ; ret.inputSNMP = (ushort)((Data[start + 13] & 0xFF) | (Data[start + 12] & 0xFF) << 8);; ret.outputSNMP = (ushort)((Data[start + 15] & 0xFF) | (Data[start + 14] & 0xFF) << 8);;; ret.dPkts = RawToUInt(ref Data, start + 16); ret.dOctets = RawToUInt(ref Data, start + 20); ret.first = RawToUInt(ref Data, start + 24); ret.last = RawToUInt(ref Data, start + 28); ret.srcport = (ushort)((Data[start + 33] & 0xFF) | (Data[start + 32] & 0xFF) << 8); ret.dstport = (ushort)((Data[start + 35] & 0xFF) | (Data[start + 34] & 0xFF) << 8); ret.pad1 = Data[start + 36]; ret.tcp_flags = Data[start + 37]; ret.protIP = Data[start + 38]; ret.tosIP = Data[start + 39]; ret.src_as = (ushort)((Data[start + 41] & 0xFF) | (Data[start + 40] & 0xFF) << 8); ret.dst_as = (ushort)((Data[start + 43] & 0xFF) | (Data[start + 42] & 0xFF) << 8); ret.src_mask = Data[start + 44]; ret.dst_mask = Data[start + 45]; ret.pad2 = (ushort)((Data[start + 47] & 0xFF) | (Data[start + 46] & 0xFF) << 8); return(ret); }
private void StartThread() { UdpClient receivingUdpClient = new UdpClient(PortServer); IPEndPoint RemoteIpEndPoint = null; try { while (!IsStop) { try { byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint); byte[] ip = RemoteIpEndPoint.Address.GetAddressBytes(); if (receiveBytes[1] != 0x05) { continue; } HeaderNetFlow header = this.ParsingHeder(ref receiveBytes); header.FromHost = (uint)(ip[3] & 0xFF | (ip[2] & 0xFF) << 8 | (ip[1] & 0xFF) << 16 | (ip[0] & 0xFF) << 24);//RawToUInt(ref ip, 0); RowNetFlow[] rows = new RowNetFlow[header.Count]; for (int i = 0; i < header.Count; i++) { rows[i] = this.ParsingRow(ref receiveBytes, 24 + i * 48); } if (uiContext != null) { uiContext.Post(OnNewPackage, new NewPackageEvent(receiveBytes) { Header = header, Rows = rows }); } else { OnNewPackage(new NewPackageEvent(receiveBytes) { Header = header, Rows = rows }); } } catch (ThreadAbortException exAbort) { Logs.Write(exAbort); } catch (Exception e) { Logs.Write(e); } } receivingUdpClient.Close(); } catch (Exception ex) { Logs.Write(ex); receivingUdpClient.Close(); } }