2013-10-22 20 views
0

我無法從列表中檢索值 Packet.net和SharpPcap是這裏使用的兩個庫! 我有2個功能,做的主要工作 一日一 這個功能是從ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessPacket), ph); 這是後臺工作 內部調用這是調用ProcessTcpPacket()添加元素後列表計數爲null

private void ProcessPacket(object p) 
    { 
     PacketHolder pHolder = (PacketHolder) p; 
     RawCapture raw = pHolder.RawPacket; 

     Packet packet = null; 
     if (raw.LinkLayerType == LinkLayers.Ethernet) 
     { 
      packet = Packet.ParsePacket(PacketDotNet.LinkLayers.Ethernet, raw.Data); 
     } 
     else if (raw.LinkLayerType == LinkLayers.LinuxSLL) 
     { 
      packet = Packet.ParsePacket(PacketDotNet.LinkLayers.LinuxSLL, raw.Data); 
     } 

     while (packet.PayloadPacket != null) 
     { 
      packet = packet.PayloadPacket; 
     } 

     if (packet is TcpPacket && packet.PayloadData != null) 
     { 
      if (packet.PayloadData.Length > 0) 
      { 
       TcpPacket tcp = (TcpPacket) packet; 
       ProcessTcpPacket(tcp, raw.Timeval, pHolder.Index); //called here! 
      } 
     } 
     else 
     { 
      if (packet.PayloadData.Length > 0) 
      { 
       UdpPacket udp = (UdpPacket) packet; 
       ProcessUdpPacket(udp, raw.Timeval, pHolder.Index); 
      } 
     } 

    } 

private void ProcessTcpPacket(TcpPacket tcp, PosixTimeval posixTimeval, ulong Index) 
    { 
     IpPacket parentPacket = (IpPacket) tcp.ParentPacket; 

     IPAddress tcpSrcAddress = SourceIPList.Find(srcIP => srcIP.Equals(parentPacket.SourceAddress)); 
     IPAddress tcpDstAddress = DestinationIPList.Find(dstIP => dstIP.Equals(parentPacket.DestinationAddress)); 

     if (tcpSrcAddress.Equals(parentPacket.SourceAddress) || tcpDstAddress.Equals(parentPacket.DestinationAddress)) 
     { 
      PacketDetails pd = new PacketDetails(); //class with simple getters and setters 
      pd.Index = Index; 
      pd.Time = posixTimeval; 
      pd.Buffer = tcp.PayloadData; 
      //TcpPackets.Add(pd); 
      socketHelper.tcpPackets.Add(pd); //properly adds all the packets to list 

     } 
    } 

現在下面這個函數是函數在SocketHelper類裏面我想檢索tcpPackets列表裏面的數據

public void ProcessTCPMessage(TcpClient tcpClient, NetworkStream stream, byte[] clientByte) 
    { 
     tcpPackets = new List<PacketDetails>(128); 
     strRequest = Encoding.ASCII.GetString(clientByte, 0, clientByte.Length); 
     myClient = tcpClient; 
     strRequest = strRequest.Substring(0, 5); 
     _form1 = new Form1(); 
     if (strRequest.Equals("Hello")) 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       strResponse = tcpPackets[i].Buffer.ToString(); // here I get the list count as null and throws an exception.. 
      } 
     } 
     else 
     { 
      strResponse = "What?"; 
     } 
     bytesSent = Encoding.ASCII.GetBytes(strResponse); 
     stream.Write(bytesSent, 0, bytesSent.Length); 
    } 

我不知道我在做什麼錯! Plz幫助!如果我正在做一些愚蠢的事情,儘量不要粗魯!只是回覆我認爲我是noob! :P:D

+0

+1暱稱:) –

+2

你正在給tcpPackets分配一個PacketDetails列表(128條目),你永遠不會用任何東西填充它,但是從它開始閱讀(你的錯誤在哪裏)。 –

+0

指數超出範圍。必須是非負數且小於集合的大小。這是我得到的異常,如果我做tcpPackets = new List ();那麼它也不會工作! 這只是一個不應該導致任何問題的默認初始容量 – Questioner

回答

0

tcpPackets爲空:它初始化爲一個初始容量爲128個項目的列表,但它不包含任何項目(沒有向其添加項目的代碼),因此嘗試訪問其項目前100個項目將導致錯誤。

+0

當添加時,我打印到控制檯我得到的列表數超過8000,忘了說ProcessPacket(object p)函數在Form1.cs中,只有ProcessTCPMessage()在另一個類中! – Questioner

+0

你的代碼沒有添加任何東西到'tcpPackets' – MiMo

+0

我的朋友我添加到'tcpPackets' [鏈接](http://s15.postimg.org/mf281x117/untitled.jpg) 檢查鏈接中的調試圖像 – Questioner

0

您在ProcessTCPMessage方法開始實例化tcpPackets名單,但你不把任何元素在for循環使用它之前。因此,當您嘗試使用列表元素的Buffer屬性時,元素爲空(或更準確地說,null),從而產生NullReferenceException

+0

tcpPackets = new List ();那麼它也不會工作! – Questioner

+0

這沒有什麼區別。在某些時候,你需要在列表中插入一些對象。你只是創建一個空的。 – Rik