2011-09-19 64 views
1

如果不在這裏複製所有的源代碼,我正在從pcap_dispatch打到pcap_callback函數。 caplen似乎顯示正確的長度(因爲它總是東西),但len總是等於0.該字段不再填充?這可能是我沒有捕獲的錯誤條件?struct pcap_pkthdr len總是==零

這裏是一個片段...

void myCallback (const struct pcap_pkthdr *header, const u_char *packet, void* buffer) 
{ 
    if ((uint16_t)(header->len) != (uint16_t)(header->caplen)) 
     /* Some Error */ 
     streamObj << "Caplen (" << (uint16_t)(header->caplen) << " != " 
     << ") Packet Len (" << (uint16_t)(header->len) << ")"; 
    ... 
} 

header->len值總是回來爲零。如果需要更多信息,請告訴我。

這發現在運行帶2.6.32內核的libpcap.so.0.9.8的SUSE Linux 11SP1服務器上。該問題僅在使用libpcap.so.0.9.3從SUSE Linux 10SP3升級後才存在。

編輯: 這似乎只是與libpcap.so.0.9.8問題。我重新命名了/ usr/lib /中的鏈接以使用libpcap.so.0.9.3,問題消失了。

+0

我建議你看看你回來的記憶指針! – sarat

+0

@sarat。通常我會同意你的看法。但是,頭指針是由libpcap填充的指針。我真的無法控制那裏會發生什麼。 – user953665

+0

@ user953665如果你認爲某些特別對版本敏感的東西,並且在文檔中沒有關於這種行爲有意改變的註釋,那麼你可能需要從源代碼構建libpcap ...然後進入函數調用得到你的答案。舊版本的完整源代碼可在此獲得:http://www.tcpdump.org/release/ – HostileFork

回答

0

的三個參數的回調函數爲pcap_dispatch(),按順序:

  1. 的「用戶數據」的指針傳遞給pcap_dispatch();
  2. 指向struct pcap_pkthdr的指針;
  3. 指向原始數據包數據的指針。

因此,myCallback不是有效的回調函數,而不能傳遞給pcap_dispatch(),因爲它的預期的第一個參數是所述指針struct pcap_pkthdr。除非你有另一個函數是真正的回調函數,然後用適當的參數調用myCallback,那麼這些代碼將無法工作,並且應該至少得到C或C++編譯器的警告。