Domanda
Sono stato molto interessati a utilizzare SharpPcap , ma finora non è stato andando bene.
Il problema principale è il seguente codice:
private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
if(packet is TCPPacket)
{
DateTime time = packet.Timeval.Date;
int len = packet.PcapHeader.len;
TCPPacket tcp = (TCPPacket)packet;
string srcIp = tcp.SourceAddress;
string dstIp = tcp.DestinationAddress;
int srcPort = tcp.SourcePort;
int dstPort = tcp.DestinationPort;
Console.WriteLine("{0}:{1}:{2},
{3} Len={4} {5}:{6} -> {7}:{8}",
time.Hour, time.Minute, time.Second,
time.Millisecond, len, srcIp, srcPort,
dstIp, dstPort);
}
}
"Il tipo o dello spazio dei nomi potrebbe TCPPacket non può essere trovato "
OK, così ho pensato che deve essere TcpPacket? -ma poi si avvicinò con questo errore:
"Il dato espressione non è mai del disponibile ( 'PacketDotNet.TcpPacket') digitare "
Ignorando che:
" '' non SharpPcap.CaptureEventArgs contiene una definizione per 'timeval' e nessun metodo di estensione 'timeval' accettare un primo parametro di tipo 'SharpPcap.CaptureEventArgs' potrebbero essere trovato "
E così via, e così via. Quindi la mia domanda è, mi sto perdendo qualcosa?
Ho le PacketDotNet e SharpPcap biblioteca per, e ha aggiunto entrambe le istruzioni using.
Soluzione: Packet confezione = Packet.ParsePacket (packet.Packet); TcpPacket tcpPacket = TcpPacket.GetEncapsulated (pacchetto);
DateTime time = packet.Packet.Timeval.Date;
int len = packet.Packet.Data.Length;
if (tcpPacket != null)
{
IpPacket ipPacket = (IpPacket)tcpPacket.ParentPacket;
IPAddress srcIp = ipPacket.SourceAddress;
IPAddress dstIp = ipPacket.DestinationAddress;
ushort srcPort = tcpPacket.SourcePort;
ushort dstPort = tcpPacket.DestinationPort;
MessageBox.Show(String.Format("{0}:{1}:{2},{3} Len={4} {5}:{6} -> {7}:{8}",
time.Hour, time.Minute, time.Second, time.Millisecond, len,
srcIp, srcPort, dstIp, dstPort)
);
}
Soluzione
Soluzione:
Packet pack = Packet.ParsePacket(packet.Packet);
TcpPacket tcpPacket = TcpPacket.GetEncapsulated(pack);
DateTime time = packet.Packet.Timeval.Date;
int len = packet.Packet.Data.Length;
if (tcpPacket != null)
{
IpPacket ipPacket = (IpPacket)tcpPacket.ParentPacket;
IPAddress srcIp = ipPacket.SourceAddress;
IPAddress dstIp = ipPacket.DestinationAddress;
ushort srcPort = tcpPacket.SourcePort;
ushort dstPort = tcpPacket.DestinationPort;
MessageBox.Show(String.Format("{0}:{1}:{2},{3} Len={4} {5}:{6} -> {7}:{8}",
time.Hour, time.Minute, time.Second, time.Millisecond, len,
srcIp, srcPort, dstIp, dstPort)
);
}
Altri suggerimenti
Guardando la prima parte del codice ...
private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
if(packet is TCPPacket)
{
pacchetto sembra essere di tipo CaptureEventArgs, non TCPPacket. Probabilmente c'è qualche proprietà dei args evento che è il pacchetto attuale. Se questo è corretto, allora la
" '' non SharpPcap.CaptureEventArgs contiene una definizione per 'timeval' e nessun metodo di estensione 'timeval' accettare un primo parametro di tipo 'SharpPcap.CaptureEventArgs' potrebbero essere trovato "
E 'probabilmente vero per questo motivo; le CaptureEventArgs e il pacchetto non sono la stessa cosa.
Modifica
vorrei provare qualcosa di simile:
private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
if(packet.packet is TCPPacket)
{
TCPPacket tcpPack = (TCPPacket)(packet.packet);
DateTime time = tcpPack.Timeval.Date;
int len = tcpPack.PcapHeader.len;
string srcIp = tcpPack.SourceAddress;
string dstIp = tcpPack.DestinationAddress;
int srcPort = tcpPack.SourcePort;
int dstPort = tcpPack.DestinationPort;
Console.WriteLine("{0}:{1}:{2},
{3} Len={4} {5}:{6} -> {7}:{8}",
time.Hour, time.Minute, time.Second,
time.Millisecond, len, srcIp, srcPort,
dstIp, dstPort);
}
}