2014-04-08 77 views
0

我試圖使用pcap_next但此行我的程序停止:線程1:EXC_BAD_ACCESS(代碼= 1,地址= 0x0),並且pcap_next

packet = pcap_next([self pcap_socket], hdr); 

與錯誤:

thread1: EXC_BAD_ACCESS (code=1, address=0x0) 

這裏是我的代碼:

-(const u_char*)readOnPcapDescriptor 
{ 
    if([self pcap_is_open]) { 
     struct pcap_pkthdr *hdr = NULL; 
     const u_char *packet; 

     // read for the next packet 
     packet = pcap_next([self pcap_socket], hdr); 

     if(packet==NULL) 
      return NULL; 
     else 
      return packet; 
    } 

    printf("NOK\nOpen descriptor First!\n\n"); 
    exit(1); 
} 

我不明白我的錯誤在哪裏。該pcap_t描述符是在這之前開:

pcap_t * open_socket = pcap_open_live(if_name,BUFSIZ,1,1,pcap_errbuf); 

和受影響的實例變量:

[self setPcap_socket:open_socket]; 
+0

你確認'pcap_open_live'實際返回非NULL嗎? –

+0

是的,我正在使用pcap描述符發送pcap_inject數據包,然後用pcap_next開始讀取 – blackndoor

回答

1

pcap_next documentation不說,pcap_pkthdr參數允許爲空。嘗試傳遞一個有效的指針pcap_pkthdr結構:

struct pcap_pkthdr hdr = {0}; 
packet = pcap_next([self pcap_socket], &hdr); 
+0

謝謝!現在它可以工作,但我只能讀取2個數據包。 – blackndoor

0

pcap_next()文檔告訴你。「該pcap_pkthdr指向的結構由H與用於數據包的相應值填入」

h被稱爲在你的榜樣hdr,你初始化像這樣:

struct pcap_pkthdr *hdr = NULL; 

換句話說,pcap_next()試圖在NULL訪問的地址,這是究竟是什麼錯誤消息指出。

0

I can only read 2 packets

引述pcap_next()手冊頁:

pcap_next() returns a pointer to the packet data on success, and 
    returns NULL if an error occured, or if no packets were read from a 
    live capture (if, for example, they were discarded because they didn't 
    pass the packet filter, or if, on platforms that support a read timeout 
    that starts before any packets arrive, the timeout expires before any 
    packets arrive, or if the file descriptor for the capture device is in 
    non-blocking mode and no packets were available to be read), or if no 
    more packets are available in a ``savefile.'' Unfortunately, there is 
    no way to determine whether an error occured or not. 

這裏最重要的是「,並返回NULL,如果......如果沒有數據包從一個實時捕捉(讀...或者,如果,在支持在任何數據包到達之前開始的讀取超時的平臺上,在任何數據包到達之前超時到期......「

BSD風格的操作系統,例如OS X和iOS,支持在任何數據包數據包到達,因此如果沒有任何分組,則可能返回NULL目前爲。那不是的意思是會有從來沒有是任何包;你必須保持循環。

pcap_next()不區分錯誤和超時;正如手冊頁所述,「不幸的是,無法確定是否發生了錯誤。」因此,它不是,也從來不是一個很好的例程。

如果你不想使用採取回調例程,如pcap_dispatch()pcap_loop(),我建議你使用pcap_next_ex(),這錯誤和「到達超時時間間隔內沒有數據包」區別開來。

+0

這正是我的問題「在任何數據包到達之前讀取超時開始」。 – blackndoor

+0

我將pcap_open_live中的to_ms從1改爲100.現在,我收到了我想要的所有內容。 事實上,一開始我使用pcap_next_ex,我也收到了2個數據包。我認爲問題來自非阻塞模式。這就是爲什麼我試圖使用pcap_next。現在,我將代碼更改爲pcap_next_ex,其to_ms爲100,並且可以工作。 謝謝 – blackndoor

+0

「我認爲問題來自非阻塞模式。」只有使用'pcap_setnonblock()'將其打開時,非阻塞模式纔是問題。它默認關閉。非阻塞模式*不是使用'pcap_next()'的理由; 'pcap_next_ex()','pcap_loop()'和'pcap_dispatch()'都比'pcap_next()'更好地處理非阻塞模式。 –

相關問題