2013-10-22 14 views
0

목록에서 값을 가져 오는 데 문제가 있습니다. Packet.net 및 SharpPcap은 여기에 사용 된 두 라이브러리입니다! 나는 주요 작업을 수행이 기능이 1 일이 기능은 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 클래스 내부에서 나는

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); 
    } 

내가 잘못하고있는 무슨 모르는 tcpPackets리스트 내부의 데이터를 검색 할 위치! Plz 도와주세요! 어리석은 짓을하다 보면 무례하지 않도록 노력하십시오! 그냥 멍청하다고 생각하면 대답 해! : P : D

+0

닉네임 +1 : –

+2

PacketDetails (128 개 항목) 목록을 tcpPackets에 할당합니다. 아무 것도 기입하지 않지만 읽는 것을 시작하십시오 (오류가있는 곳). –

+0

인덱스가 범위를 벗어났습니다. 음수가 아니어야하며 콜렉션의 크기보다 작아야합니다. 이것은 내가받는 예외이고 Marvin이라면 tcpPackets = new List (); 그 때 그것은 또한 일하지 않을 것이다! 그리고 그게 그냥 문제가 없어야 기본 기본 용량입니다 – Questioner

답변

0

tcpPackets은 비어 있습니다. 초기 용량은 128 개이지만 목록에 항목을 포함하지 않으므로 (항목을 추가하는 코드가 없음) 해당 항목에 액세스하려고합니다. 처음 100 개 항목은 오류가 발생합니다.

+0

내가 추가하는 동안 콘솔에 인쇄 할 때 8000 이상의 목록 개수를 얻을 때 ProcessPacket (개체 p) 함수는 Form1.cs에 있으며, ProcessTCPMessage() 만 다른 클래스에 있습니다! – Questioner

+0

코드가 'tcpPackets'에 아무 것도 추가하지 않습니다 – MiMo

+0

내 친구가'tcpPackets'에 추가 중입니다 [link] (http://s15.postimg.org/mf281x117/untitled.jpg) 링크에서 디버그 이미지를 확인하십시오 – Questioner

0

ProcessTCPMessage 메서드의 시작 부분에 tcpPackets 목록을 인스턴스화하고 있지만 for 루프에서 사용하기 전에 요소를 입력하지 마십시오. 따라서 목록 요소의 Buffer 속성을 가져 오려고하면 요소가 비어 있거나 (보다 정확하게는 null) NullReferenceException이됩니다.

+0

tcpPackets = 새 List (); 그 때 그것은 또한 일하지 않을 것이다! – Questioner

+0

차이는 없습니다. 어떤 시점에서 List에 개체를 삽입해야합니다. 당신은 빈 것을 만드는 것입니다. – Rik