0

リストから値を取得できません Packet.net と SharpPcap は、ここで使用される 2 つのライブラリです。主な作業を行う 2 つの関数があります 1 つ目 この関数はThreadPool.QueueUserWorkItem(new WaitCallback(ProcessPacket), ph); 、バックグラウンド ワーカー内から呼び出されます これは、ProcessTcpPacket() を呼び出す関数です

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 

        }
    }

以下の関数は、tcpPackets リスト内のデータを取得する 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);
    }

何が間違っているのかわからない!助けてください!そして、私がばかげたことをしているなら、失礼にならないようにしてください!私が初心者だと思って返信してください!:P:D

4

2 に答える 2

0

tcpPackets空です: 初期容量が 128 項目のリストとして初期化されますが、項目が含まれていないため (項目を追加するコードはありません)、最初の 100 項目にアクセスしようとするとエラーが発生します。

于 2013-10-22T09:46:46.840 に答える
0

tcpPacketsメソッドの先頭でリストをインスタンス化していますが、ループProcessTCPMessageで使用する前に要素を入れていません。forそのため、リスト要素のプロパティを読み込もうとするとBuffer、要素が空 (より正確にはnull) になり、結果としてNullReferenceException.

于 2013-10-22T09:46:58.957 に答える