목록에서 값을 가져 오는 데 문제가 있습니다. 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
닉네임 +1 : –
PacketDetails (128 개 항목) 목록을 tcpPackets에 할당합니다. 아무 것도 기입하지 않지만 읽는 것을 시작하십시오 (오류가있는 곳). –
인덱스가 범위를 벗어났습니다. 음수가 아니어야하며 콜렉션의 크기보다 작아야합니다. 이것은 내가받는 예외이고 Marvin이라면 tcpPackets = new List(); 그 때 그것은 또한 일하지 않을 것이다! 그리고 그게 그냥 문제가 없어야 기본 기본 용량입니다 –
Questioner