我已經連接到使用如何通過數據包從Linux TUN讀取數據包/ TAP
fd = open(...)
現在我想通過包從中讀取數據包與現有自來水設備。 如果我使用
read(fd,buffer,sizeof(buffer));
我不會準確讀數1包。
我怎樣才能正確讀取1個數據包? 是否有某種標題說明數據包長度,或者在最壞的情況下,我將不得不解析數據包並自己計算長度?
我已經連接到使用如何通過數據包從Linux TUN讀取數據包/ TAP
fd = open(...)
現在我想通過包從中讀取數據包與現有自來水設備。 如果我使用
read(fd,buffer,sizeof(buffer));
我不會準確讀數1包。
我怎樣才能正確讀取1個數據包? 是否有某種標題說明數據包長度,或者在最壞的情況下,我將不得不解析數據包並自己計算長度?
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
謝謝! 但似乎我錯了,當我從水龍頭設備讀取()時,我得到了正好1幀(或更少,如果bytes_to_read是少)。 所以我did not真的不得不做任何事情只是使用閱讀,它給了我一個框架.. – yonigo
我是錯的方式read()
讀取自來水設備的字節。 事實證明,當我使用read()
它讀取正好1幀(或n字節,如果n小於幀大小)
「包」你的意思是「以太網幀」?普通用戶無法訪問協議元數據,因此如果您使用以太網,則不會看到幀數據,只是有效負載。您需要像libpcap那樣提升權限才能訪問原始數據。 –
是的,我需要閱讀整個框架與所有標題, 無論如何,如果我只是讀有效載荷,我怎麼知道它的大小,以便我知道多少讀?每個有效載荷前是否有一個標題? – yonigo
當沒有更多數據時,「read」調用會被阻塞,或者在非阻塞模式下設置錯誤「EAGAIN」。 –