2013-10-22 52 views
0

我有一個特定的網卡(NetFPGA),它在ICMP Echo Reply數據包的末尾添加了一個8字節的時間戳(忽略校驗和)。當我試圖通過這種方式讀取數據包的原始套接字:在Linux原始套接字中接收完整修改的icmp數據包

recvsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 

我只是沒有添加時間戳的IP + ICMP數據。 我想:

recvsock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); 

這樣,我得到的一切,我不能綁定任何地址。 也試過:

recvsock = socket(AF_INET, SOCK_RAW, htons(ETH_P_IP)); 

但沒有被抓了..

任何想法,我怎麼能打開一個原始套接字將只捕獲特定的ICMP回顯應答報文,但不會忽略附加8字節的時間戳?

感謝

+0

你可以嘗試使用帶有AF_PACKET選項的socket()嗎? (有關詳情,請參見man 7包)這將幫助您從L2級捕獲數據包,因此丟棄時間戳信息的機會可能會消失。我懷疑您需要在設備驅動程序級別捕獲數據包以獲取時間戳記信息。 –

+0

是的。直到現在,只有第二種選擇(套接字(AF_PACKET,SOCK_RAW,htons(ETH_P_IP)))爲我工作。但是這樣我就必須解析我自己的所有數據,並找出它是否與我有關的ICMP數據包。我尋找更好的L2數據包分辨率,但沒有找到。 – Ido

+0

正在爲您的目的解析問題嗎? –

回答

0

從我發現顯然是沒有辦法趕上原始套接字全包,仍然使插座做過濾爲您服務。果然不出我所要做的就是建立一個socket這樣:

recvsock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); 

爲了捕捉所有傳入的IP數據包,然後基於libpcap的過濾功能,過濾掉我的ICMP數據包。

相關問題