我正在編寫代碼發送兩個Linux機器之間的原始以太網幀。爲了測試這個,我只想得到一個簡單的客戶端發送和服務器接收。linux原生以太網套接字綁定到特定的協議
我有客戶端正確的數據包(我可以看到他們使用數據包嗅探器)。
在服務器端,我初始化套接字像這樣:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
其中MY_ETH_PROTOCOL
是2字節常量我使用的以太網類型,所以我沒有聽到無關的網絡流量。
當我綁定此套接字我界面,我必須在socket_addr結構再次傳遞一個協議: socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
如果我編譯和運行這樣的代碼,然後它失敗。我的服務器沒有看到數據包。但是,如果我改變,像這樣的代碼:
socket_address.sll_protocol = htons(ETH_P_ALL);
然後,服務器可以看到從客戶端發送的數據包(以及許多其它數據包),所以我要做的分組的一些檢查,看看它匹配MY_ETH_PROTOCOL
。
但我不希望我的服務器聽到指定協議上未發送的流量,因此這不是解決方案。我該怎麼做呢?
您可以將代碼粘貼到您設置'socket_address'的地方嗎? – bstpierre 2010-07-29 21:58:06