Question
J'ai été très intéressé à utiliser SharpPcap , mais jusqu'à présent cela n'a pas été va bien.
Le principal problème est le code suivant:
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);
}
}
"Le TCPPacket de type ou espace de noms pourrait pas trouvé "
OK, je me suis dit qu'il doit donc être TcpPacket? -mais il est venu avec cette erreur:
"L'expression donnée est jamais du à condition que ( 'PacketDotNet.TcpPacket') type "
Ignorant que:
" 'SharpPcap.CaptureEventArgs' ne pas contiennent une définition pour « timeval » et aucune méthode d'extension « timeval » l'acceptation d'un premier argument de type « SharpPcap.CaptureEventArgs » pourrait être trouvé "
Et ainsi de suite, et ainsi de suite. Donc, ma question est, que je manque quelque chose?
Je les deux déclarations à l'aide de la Bibliothèque PacketDotNet et SharpPcap et ajoutés.
Solution: Pack de paquet = 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)
);
}
La solution
Solution:
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)
);
}
Autres conseils
En regardant la première partie du code ...
private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
{
if(packet is TCPPacket)
{
paquet semble être de type CaptureEventArgs, pas TCPPacket. Probablement, il y a une propriété des args événement qui est votre paquet réel. Si cela est correct, le
" 'SharpPcap.CaptureEventArgs' ne pas contiennent une définition pour « timeval » et aucune méthode d'extension « timeval » l'acceptation d'un premier argument de type « SharpPcap.CaptureEventArgs » pourrait être trouvé "
est probablement vrai pour cette raison; les CaptureEventArgs et le paquet ne sont pas la même chose.
EDIT:
Je voudrais essayer quelque chose comme:
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);
}
}