2012-07-25 77 views
0

在我在做,可以收到ACK和建立連接的TCP程序嘗試我碰到這個功能在一個示例程序來:瞭解功能。 PCAP和BPF

void *pth_capture_run(void *arg) 
{ 
pcap_t *pd; 
char *filter = "dst host 172.17.14.90 and ip"; 
char *dev = "fxp0"; 
char errbuf[PCAP_ERRBUF_SIZE]; 
bpf_u_int32 netp; 
bpf_u_int32 maskp; 
struct bpf_program fprog;     /* Filter Program */ 
int dl = 0, dl_len = 0; 

if ((pd = pcap_open_live(dev, 1514, 1, 500, errbuf)) == NULL) { 
    fprintf(stderr, "cannot open device %s: %s\n", dev, errbuf); 
    exit(1); 
} 

pcap_lookupnet(dev, &netp, &maskp, errbuf); 
pcap_compile(pd, &fprog, filter, 0, netp); 
if (pcap_setfilter(pd, &fprog) == -1) { 
    fprintf(stderr, "cannot set pcap filter %s: %s\n", filter, errbuf); 
    exit(1); 
} 
pcap_freecode(&fprog); 
dl = pcap_datalink(pd); 

switch(dl) { 
    case 1: 
     dl_len = 14; 
     break; 
    default: 
     dl_len = 14; 
     break; 
} 

if (pcap_loop(pd, -1, raw_packet_receiver, (u_char *)dl_len) < 0) { 
    fprintf(stderr, "cannot get raw packet: %s\n", pcap_geterr(pd)); 
    exit(1); 
} 
} 

現在我已經收集這個函數打開一個BPF設備和設置數據包過濾器,然後等待數據包到達。然而,對於網絡編程我很陌生,我不熟悉各種pcap函數,並且還不清楚這個函數的功能,簡而言之,它是如何工作的以及它是如何工作的。我已閱讀本教程:http://yuba.stanford.edu/~casado/pcap/section1.html 但我仍然有點困惑。你們中的任何一個都可以用更簡單的術語來解釋嗎謝謝!

+0

哪一部分正是混淆了你? – RedX 2012-07-25 23:04:17

+0

@RedX絕大多數是誠實的,但特別是前兩個if語句和中間的位。我知道我在這裏有點泛泛,但正如我所說,這對我來說都是新鮮事。 – youjustreadthis 2012-07-25 23:26:24

回答

2

看起來你已經想出了至少在邏輯上與第一個if語句相同的函數,它試圖打開你正在監聽的設備,如果失敗則打印錯誤,第二個設置編譯後的pcap過濾器。

如果您想了解更多關於特定功能及其參數的信息,您應該只是看一下手冊頁,

人pcap_open_live