Ich arbeite an der Entwicklung eines benutzerdefinierten Paket-Sniffer für Windows 7 64-Bit-Host-System (NIC-Karte Realtek PCIe GBE Family Controller) und benutze WinPcap 4.3.1 Bibliothek mit C-Programmierung und Cygwin-Entwicklungsplattform. Ich kann ausgehende und eingehende TCP- und UDP-Pakete über mein Programm lesen. Allerdings bin ich in einem Problem stecken nicht in der Lage, korrekte Zeitstempel in Mikrosekunde von der Struktur Struktur pcap_pkthdr bekommen. Es folgt der Code-Schnipsel aus dem Programm, in dem das Problem besteht:Cygwin und WinPcap 4.1.3 Zeitstempel - Mikrosekundenausgabe - Header-> ts.tv_usec nicht korrekt - C Programm
...
int getPacket;
struct pcap_pkthdr *header;
const u_char *pkt_data;
/* Sniff the packets */
while((getPacket= pcap_next_ex(handle, &header, &pkt_data)) >= 0)
{
printf("\n 1) Epoch is: %ld",header->ts.tv_sec&0x00000000ffffffff);
printf("\n 2) Microsecond is: %ld",header->ts.tv_usec);
...
Im Anschluss an die Konsolausgabe, die ich für diese 2 printf() Aussagen in einem Lauf bekam:
1) Epoche ist: 1460262399
2) Mikrosekunde ist: 1576252997999
Zeit in Sekunden (Header-> ts.tv_sec & 0x00000000ffffffff) korrekt ist, wie es zu 2016.04.09 :: 23 übersetzt: 26: 39 (yy-mm- dd :: hh-mm-ss Format)
jedoch Mikrosekunden- (Header-> ts.tv_usec) nicht korrekt ist als der Hexadezimalwert von Mikrosekunde 0x16F0000016F ist, die immer diese Art zeigt Muster von sich wiederholenden (mit verschiedenen Werten) bei der niedrigen und hohen Oktettpositionen. Ich habe Speicherabzüge analysiert und dieselben Werte gefunden, die mich glauben lassen, dass der header-> ts.tv_usec nicht korrekt durch den NPF-Treiber gefüllt wird.
Ich habe viel gesucht und konnte dieses Problem nirgendwo gefunden finden. Außerdem habe ich den Code auf separaten AMD- und Intel-Rechnern getestet und das Problem scheint zu bestehen.
Alle Vorschläge zur Lösung dieses Problems werden sehr geschätzt.
Alle Bits von 'tv_sec' sind signifikant, daher sollte man sie nicht mit' 0x00000000ffffffff' verknüpfen. Was passiert, wenn Sie nur 'printf (" \ n 1) Epoch ist:% ld ", header-> ts.tv_sec);'? –
Danke Guy.In der Tat habe ich ANDing mit '0x00000000ffffffff' gezeigt, um die Tatsache hervorzuheben, dass nur 32 niedrigerwertige Bits von tv_sec gültig sind. In meinem Code schreibe ich es mit (int). 'printf (" \ n 1) Epoch ist:% ld ", header-> ts.tv_sec) ergibt die volle 64-Bit-Zahl, z. '1341397056348719 (0x4C3FE570BE22F)'. Sie können sehen, dass nur die letzten 8 Oktetts sinnvoll sind. Ich habe es durch Tests und Versuche gefunden. – Han
"Markieren Sie die Tatsache, dass nur 32 niedrigerwertige Bits von tv_sec gültig sind" Wenn das eine Tatsache ist, ist das ein * Bug * in WinPcap! Wir möchten, dass WinPcap 2038 und später, zumindest auf 64-Bit-Plattformen, weiter läuft und dass alle 64 Bits von tv_sec gültig sein müssen, und wir möchten, dass es mit UN \ * X libpcap kompatibel ist. auf dem alle 64 Bits signifikant sind. Möglicherweise gibt es * einen anderen Fehler in 64-Bit-WinPcap, der die Probleme verursacht, die Sie sehen. –