private string[] MakeTCP(TCPHeader tcpHeader) { string ack = null; if (tcpHeader.AcknowledgementNumber != "") { ack = "Acknowledgement Number : " + tcpHeader.AcknowledgementNumber; } else { ack = "Acknowledgement NUmber : "; } string[] TCPNode = new string[] { "TCP", "Source Port: " + tcpHeader.SourcePort, "Destination Port: " + tcpHeader.DestinationPort, "Sequence Number: " + tcpHeader.SequenceNumber, ack, "Header Length: " + tcpHeader.HeaderLength, "Flags: " + tcpHeader.Flags, "Window Size: " + tcpHeader.WindowSize, "Checksum: " + tcpHeader.Checksum }; return(TCPNode); }
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 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 TCP header aan de tree node. private TreeViewItem MakeTCPTreeViewItem(TCPHeader tcpHeader) { TreeViewItem tcpItem = new TreeViewItem(); tcpItem.Header = "TCP"; tcpItem.Items.Add("Source Port: " + tcpHeader.SourcePort); tcpItem.Items.Add("Destination Port: " + tcpHeader.DestinationPort); tcpItem.Items.Add("Sequence Number: " + tcpHeader.SequenceNumber); if (tcpHeader.AcknowledgementNumber != "") tcpItem.Items.Add("Acknowledgement Number: " + tcpHeader.AcknowledgementNumber); tcpItem.Items.Add("Header Length: " + tcpHeader.HeaderLength); tcpItem.Items.Add("Flags: " + tcpHeader.Flags); tcpItem.Items.Add("Window Size: " + tcpHeader.WindowSize); tcpItem.Items.Add("Checksum: " + tcpHeader.Checksum); if (tcpHeader.UrgentPointer != "") tcpItem.Items.Add("Urgent Pointer: " + tcpHeader.UrgentPointer); return tcpItem; }