首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表计数在添加元素后返回null

列表计数在添加元素后返回null
EN

Stack Overflow用户
提问于 2013-10-22 17:39:13
回答 2查看 269关注 0票数 0

我在从列表中检索值时遇到了问题,Packet.net和SharpPcap是这里使用的两个库!我有两个做主要工作的函数,第一个是从后台工作者内部的ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessPacket), ph);调用的,这是调用ProcessTcpPacket()的函数。

代码语言:javascript
复制
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列表中的数据

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2013-10-22 17:46:47

tcpPackets为空:它被初始化为一个列表,初始容量为128项,但不包含任何项(没有添加项的代码),因此尝试访问它的前100项将导致错误。

票数 0
EN

Stack Overflow用户

发布于 2013-10-22 17:46:59

您在ProcessTCPMessage方法的开头实例化了tcpPackets列表,但是在for循环中使用它之前没有放入任何元素。因此,当您试图读取list元素的Buffer属性时,该元素为空(或者更准确地说,是null),从而产生NullReferenceException

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19514220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档