Pregunta
he estado muy interesado en usar SharpPcap , pero hasta ahora no ha ido bien.
El principal problema es el siguiente código:
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);
}
}
"El tipo o espacio TCPPacket podía No se encuentran "
OK, así que pensé que debe ser TcpPacket? pero entonces se le ocurrió este error:
"La expresión dada no es de la proporcionado ( 'PacketDotNet.TcpPacket') escribir "
Haciendo caso omiso de que:
" '' no SharpPcap.CaptureEventArgs contiene una definición para 'timeval' y no método de extensión 'timeval' aceptar un primer argumento de tipo podrían ser 'SharpPcap.CaptureEventArgs' encontrado "
Y así sucesivamente, y así sucesivamente. Así que mi pregunta es, me estoy perdiendo algo?
Tengo los dos PacketDotNet las declaraciones y la biblioteca de SharpPcap y agregados utilizando.
Solución: paquete de paquetes = Packet.ParsePacket (packet.Packet); TcpPacket tcpPacket = TcpPacket.GetEncapsulated (paquete);
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)
);
}
Solución
Solución:
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)
);
}
Otros consejos
En cuanto a la primera parte del código ...
private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
if(packet is TCPPacket)
{
paquete parece ser de tipo CaptureEventArgs, no TCPPacket. Probablemente hay algo de propiedad de los argumentos del evento que es el paquete real. Si esto es correcto, entonces el
" '' no SharpPcap.CaptureEventArgs contiene una definición para 'timeval' y no método de extensión 'timeval' aceptar un primer argumento de tipo podrían ser 'SharpPcap.CaptureEventArgs' encontrado "
Es probablemente cierto para ello; los CaptureEventArgs y el paquete no son la misma cosa.
EDIT:
me gustaría probar algo como:
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);
}
}