我無法從列表中檢索值 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
+1暱稱:) –
你正在給tcpPackets分配一個PacketDetails列表(128條目),你永遠不會用任何東西填充它,但是從它開始閱讀(你的錯誤在哪裏)。 –
指數超出範圍。必須是非負數且小於集合的大小。這是我得到的異常,如果我做tcpPackets = new List();那麼它也不會工作! 這只是一個不應該導致任何問題的默認初始容量 –
Questioner