2012-09-25 73 views
0

我有一個套接字綁定到一個網卡,我用它來捕獲pcap_loop中的數據包。用pcap讀取套接字

我有一個單獨的進程運行,最終在同一臺設備上執行「讀取」操作,但只有在準備好讀取unix本地管道之後才能進行「讀取」。是否正確地說,從第二個進程讀取設備上的read()將讀取所有準備好的內容,而不是一次一個數據包,即使我的其他進程設置爲使用pcap_loop一次讀取數據包?

回答

2

我有一個套接字綁定到一個NIC,我用它來捕獲pcap_loop中的數據包。

你說「套接字」,所以我猜這是Linux(它也可能是IRIX,但這樣做的可能性很小,並且答案在這兩種情況下都是相同的;其他操作系統不在libpcap中使用套接字,這些操作系統上的本機捕獲機制使用套接字以外的機制)。

我有一個單獨的進程運行,最終在同一個設備上進行「讀取」,但只有在準備好讀取unix本地管道之後才能進行「讀取」。難道是正確地說,從第二處理設備上的閱讀()將在從一次讀取一切的準備,而不是一次只有一個包,

編號A PF_PACKET插座返回一個包read()

順便說一句,不能保證從套接字讀取並在同一時間處理libpcap中的同一個套接字將可以工作。 Libpcap可能使用內存映射機制來獲取數據包;除非你已經看過有關內存映射機制如何在其他地方完成read()的文檔,或者已經閱讀了Linux內核代碼以便弄清楚它是如何工作的,否則你可能不想假設它會以你想要的方式工作。

但是,如果這是FreeBSD的,如建議(但沒有說明)的標籤,然後在使用什麼libpcap的是BPF設備,* *的插座。一個read()將給你一個完整的緩衝數據包,read()由libpcap完成將爲libpcap提供整個緩衝數據包,即使它恰好每個數據包調用一次回調。 read()與內存映射訪問相同的問題可能會發生,但在FreeBSD的更高版本中,內存映射的BPF默認情況下不會被libpcap使用。

+0

感謝您的回覆。確實,我的命名可能是錯的,而且這在FreeBSD中也是如此。我只是假設pcap_loop(... mymethod ...)每個數據包調用一次mymethod,因爲在解析數據包時似乎是這種情況。這對我來說很困惑,因爲程序的流程,看起來像程序B一次讀取一個數據包可能會滯後於進程A,它正在爲每個數據包獲取完整緩衝區。 – Derek

+0

'pcap_loop()* *每個包都會調用一次回調函數。但是,這並不意味着它使用單獨的read()來讀取每個數據包。它讀取整個緩衝區數據包,然後遍歷緩衝區中的數據包,併爲每個數據包調用回調函數。然後它執行另一個'read()'並繼續進程(只要* cnt *參數爲-1)。 – 2012-09-28 00:55:37