2013-04-17 58 views
0

我想用PCAP捕獲數據包 ,然後發送捕獲的數據包到另一個主機 我的源代碼片段是這樣的:阻塞PCAP和多個I/O`選擇`

  for(;;){ 
        pcap_packet = pcap_next(pcap_handler, &pcap_header); 
        if(pcap_packet !=NULL) 
        printf("capture a packet with length of %d\n", pcap_header.len); 

        // send the packet as payload to the sender, excluding the Ethernet Header 
        n = send(sd_proxy, pcap_packet+ETHERNET_HDR_LEN, pcap_header.len-ETHERNET_HDR_LEN, 0); 
        if(n<0){ 
          shutdown(connfd, SHUT_RDWR); 
          close(connfd); 
          break; 
        } new 

      } 

所以基本上,我希望程序被pcap_next阻塞,一旦一個 套接字sd_proxy與另一個主機建立TCP連接,如果另一個主機啓動一個活動的TCP關閉,我想檢測這個 active關閉。理想情況下,我應該使用selectn=recv(rd_fd, ...) 如果其他主機啓動一個活動關閉,select會注意到有一些rd_fd,然後我看是否'n = 0'。 但與pcap,選擇不能配合pcap

那麼如何完成我的任務? 謝謝!

回答

1

選擇不能與PCAP

爲什麼不能合作呢?您是否嘗試過在pcap_handler上使用pcap_get_selectable_fd(),並將生成的文件描述符添加到在select()調用中設置的文件描述符中?

您正在使用Linux,因此應該Just Work。 (如果你在使用BPF的系統上運行,比如* BSD或者OS X,那麼你可能會遇到這個問題,至少在這些操作系統的老版本中是這樣的;不同的BSD有它們的select-with- BPF錯誤修復了一段時間;在OS X上,我將它修復爲Lion,因此它可能在Snow Leopard和更早的版本上出現問題。)

+0

請參閱[此郵件信息](http://thread.gmane.org/gmane .network.tcpdump.devel/6288/focus = 6293)以獲取更多信息。 – 2013-04-18 06:23:46