private void ParseData(byte[] data, int nReceived) { if (PacketNum == Convert.ToInt32(this.tscbNum.Text)) { PacketNum = 1; this.ReceivedPacketListView.Items.Clear(); } IPHeader ipHeader = new IPHeader(data, nReceived); string[] lvStrArr = new string[] { PacketNum.ToString(), DateTime.Now.ToString(), ipHeader.SourceAddress.ToString(), ipHeader.DestinationAddress.ToString(), ipHeader.ProtocolType.ToString(), ipHeader.TotalLength }; string[] IpStrArr = MakeIP(ipHeader, ipHeader.ProtocolType.ToString()); string[] MergeIPArr = new string[lvStrArr.Length + IpStrArr.Length]; Array.Copy(lvStrArr, 0, MergeIPArr, 0, lvStrArr.Length); Array.Copy(IpStrArr, 0, MergeIPArr, lvStrArr.Length, IpStrArr.Length); string[] MergeTCP = null; string[] MergeUDP = null; string[] MergeAll = null; switch (ipHeader.ProtocolType) { case Protocol.TCP: TCPHeader tcpHeader = new TCPHeader(ipHeader.Data, ipHeader.MessageLength); MergeTCP = MakeTCP(tcpHeader); MergeAll = new string[MergeIPArr.Length + MergeTCP.Length]; Array.Copy(MergeIPArr, 0, MergeAll, 0, MergeIPArr.Length); Array.Copy(MergeTCP, 0, MergeAll, MergeIPArr.Length, MergeTCP.Length); break; case Protocol.UDP: UDPHeader udpHeader = new UDPHeader(ipHeader.Data, (int)ipHeader.MessageLength); MergeUDP = MakeUDP(udpHeader); MergeAll = new string[MergeIPArr.Length + MergeUDP.Length]; Array.Copy(MergeIPArr, 0, MergeAll, 0, MergeIPArr.Length); Array.Copy(MergeUDP, 0, MergeAll, MergeIPArr.Length, MergeUDP.Length); break; case Protocol.Unknown: MergeAll = MergeIPArr; break; } ListViewItem item = new ListViewItem(MergeAll); this.ReceivedPacketListView.Items.Add(item); PacketNum += 1; }
private string[] MakeIP(IPHeader ipHeader, string ProType) { string[] IPNode = new string[] { "IP", "Ver: " + ipHeader.Version, "Header Length: " + ipHeader.HeaderLength, "Differntiated Services: " + ipHeader.DifferentiatedServices, "Total Length: " + ipHeader.TotalLength, "Identification: " + ipHeader.Identification, "Flags: " + ipHeader.Flags, "Fragmentation Offset: " + ipHeader.FragmentationOffset, "Time to live: " + ipHeader.TTL, "Protocol: " + ProType, "Checksum: " + ipHeader.Checksum, "Source: " + ipHeader.SourceAddress.ToString(), "Destination: " + ipHeader.DestinationAddress.ToString() }; return(IPNode); }
private void ParseData(byte[] byteData, int nReceived) { System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => { TreeViewItem rootItem = new TreeViewItem(); // Alle protocol packets zijn geëncapsuleerd in het IP datagram, we parsen dus de IP header om te zien welk protocol data zich hier bevindt. IPHeader ipHeader = new IPHeader(byteData, nReceived); TreeViewItem ipItem = MakeIPTreeViewItem(ipHeader); rootItem.Items.Add(ipItem); // Volgens het protocol dat meegedragen wordt door het IP datagram, parsen we het data field van het datagram. switch (ipHeader.ProtocolType) { case Protocol.ICMP: //IPHeader.Data bezit de data die gedragen wordt via het IP datagram, lengte van de header. Debug.WriteLine("ICMP test"); // HIER MOET NOG HEEL WAT CODE break; case Protocol.TCP: // IPHeader.Data bezit de data die gedragen wordt via het IP datagram, lengte van de header. TCPHeader tcpHeader = new TCPHeader(ipHeader.Data, ipHeader.MessageLength); TreeViewItem tcpItem = MakeTCPTreeViewItem(tcpHeader); rootItem.Items.Add(tcpItem); // Als de poort gelijk is aan 53, dan is het onderliggende protocol DNS. // Note: DNS kan enkel TCP of UDP gebruiken, daarom --> 2 keer controle. if (tcpHeader.DestinationPort == "53" || tcpHeader.SourcePort == "53") { TreeViewItem dnsItem = MakeDNSTreeViewItem(tcpHeader.Data, tcpHeader.MessageLength); rootItem.Items.Add(dnsItem); } break; case Protocol.UDP: // IPHeader.Data bezit de data die gedragen wordt via het IP datagram, lengte van de header. UDPHeader udpHeader = new UDPHeader(ipHeader.Data, ipHeader.MessageLength); TreeViewItem udpItem = MakeUDPTreeViewItem(udpHeader); rootItem.Items.Add(udpItem); // Als de poort gelijk is aan 53, dan is het onderliggende protocol DNS. // Note: DNS kan enkel TCP of UDP gebruiken, daarom --> 2 keer controle. if (udpHeader.DestinationPort == "53" || udpHeader.SourcePort == "53") { // Lengte van UDP header is altijd 8 bytes, dus we trekken deze af van totale lengte om eigenlijke lengte van de data te kennen. TreeViewItem dnsItem = MakeDNSTreeViewItem(udpHeader.Data, Convert.ToInt32(udpHeader.Length) - 8); rootItem.Items.Add(dnsItem); } break; case Protocol.Unknown: break; } AddTreeItem addTreeViewItem = new AddTreeItem(OnAddTreeViewItem); rootItem.Header = ipHeader.SourceAddress.ToString() + "-" + ipHeader.DestinationAddress.ToString(); //!!!!!!!!!!!!!!!!! // Thread: veilig toevoegen van de Items. treeView.Dispatcher.Invoke(addTreeViewItem, new object[] { rootItem }); })); }
// Helper functie die informatie teruggeeft vanuit de IP header aan de tree node. private TreeViewItem MakeIPTreeViewItem(IPHeader ipHeader) { TreeViewItem ipItem = new TreeViewItem(); ipItem.Header = "IP"; ipItem.Items.Add("Ver: " + ipHeader.Version); ipItem.Items.Add("Header Length: " + ipHeader.HeaderLength); ipItem.Items.Add("Differntiated Services: " + ipHeader.DifferentiatedServices); ipItem.Items.Add("Total Length: " + ipHeader.TotalLength); ipItem.Items.Add("Identification: " + ipHeader.Identification); ipItem.Items.Add("Flags: " + ipHeader.Flags); ipItem.Items.Add("Fragmentation Offset: " + ipHeader.FragmentationOffset); ipItem.Items.Add("Time to live: " + ipHeader.TTL); switch (ipHeader.ProtocolType) { case Protocol.ICMP: ipItem.Items.Add("Protocol: " + "ICMP"); break; case Protocol.TCP: ipItem.Items.Add("Protocol: " + "TCP"); break; case Protocol.UDP: ipItem.Items.Add("Protocol: " + "UDP"); break; case Protocol.Unknown: ipItem.Items.Add("Protocol: " + "Unknown"); break; } ipItem.Items.Add("Checksum: " + ipHeader.Checksum); ipItem.Items.Add("Source: " + ipHeader.SourceAddress.ToString()); ipItem.Items.Add("Destination: " + ipHeader.DestinationAddress.ToString()); return ipItem; }