2013-08-27 53 views
3

我已經連接到使用如何通過數據包從Linux TUN讀取數據包/ TAP

fd = open(...) 

現在我想通過包從中讀取數據包與現有自來水設備。 如果我使用

read(fd,buffer,sizeof(buffer)); 

我不會準確讀數1包。

我怎樣才能正確讀取1個數據包? 是否有某種標題說明數據包長度,或者在最壞的情況下,我將不得不解析數據包並自己計算長度?

+0

「包」你的意思是「以太網幀」?普通用戶無法訪問協議元數據,因此如果您使用以太網,則不會看到幀數據,只是有效負載。您需要像libpcap那樣提升權限才能訪問原始數據。 –

+0

是的,我需要閱讀整個框架與所有標題, 無論如何,如果我只是讀有效載荷,我怎麼知道它的大小,以便我知道多少讀?每個有效載荷前是否有一個標題? – yonigo

+0

當沒有更多數據時,「read」調用會被阻塞,或者在非阻塞模式下設置錯誤「EAGAIN」。 –

回答

0

Libpcap庫: http://www.tcpdump.org/pcap3_man.html

可以讀取數據包來通過您指定的任何接口,在這個例子中其WLAN1。

int main(){ 
    char *device = NULL; 
    pcap_t* descr; 

    if(argc > 0) 
     device = "wlan1"; 

    if(device == NULL) 
    { 
     printf("%s\n",errbuf); 
     exit(1); 
    } 
    descr = pcap_open_live(device,BUFSIZ,0,-1,errbuf); 

    if(descr == NULL){ printf("pcap_open_live(): %s\n",errbuf); exit(1); } 

    errbuf[0] = 0; 
    handle = pcap_open_live(device, BUFSIZ,1,0,errbuf); 

    pcap_loop(handle,-1, process_packet, NULL); 
    pcap_close(handle); 
    return 0; 
    } 

pcap_loop的process_packet是未來數據包的回調。

讓我知道如果有什麼事情你是不能確定的。


P.S.這裏有一些鏈接可以幫助你解析802.11 /以太網報頭。

http://madwifi-project.org/wiki/DevDocs/RadiotapHeader http://yuba.stanford.edu/~casado/pcap/section2.html http://www.cacetech.com/documents/PPI%20Header%20format%201.0.7.pdf

+0

謝謝! 但似乎我錯了,當我從水龍頭設備讀取()時,我得到了正好1幀(或更少,如果bytes_to_read是少)。 所以我did not真的不得不做任何事情只是使用閱讀,它給了我一個框架.. – yonigo

2

我是錯的方式read()讀取自來水設備的字節。 事實證明,當我使用read()它讀取正好1幀(或n字節,如果n小於幀大小)