2011-02-14 142 views
5

我目前正在進行一項編程任務。這項任務是爲了實現客戶端,網絡仿真器和服務器。客戶端將數據包傳遞給網絡模擬器,並將網絡模擬器傳遞給服務器。反之亦然。這項任務的先決條件是我只能使用原始套接字。所以我將創建自己的IP和UDP標頭。我用wireshark測試了我的數據包。它們都是正確的,並且格式正確(正確讀取它們)。如何將原始套接字綁定到特定的端口?

另一個要求是模擬器,客戶端和服務器都有它們必須綁定的特定端口。現在,我不明白如何將原始套接字綁定到特定端口。我所有的原始套接字都會接收它們綁定的主機地址上的所有流量。根據手冊頁和互聯網上的其他地方,包括理查德史蒂文斯的「Unix網絡編程」,這就是他們應該如何工作。我的老師沒有回覆我的任何電子郵件,我可能直到星期二才能問他。我看到兩個選項在我面前。首先,我可以使用libpcap從特定設備進行過濾,然後輸出到我的原始套接字。儘管如此,我覺得這已經超出了我們任務的範圍。或者我可以在從插座接收它們後對其進行過濾。這顯然有很多開銷,因爲所有的數據包都被複制/移動通過內核。至少,這是我的理解(如果我錯了,請隨時糾正我)。

所以我的問題是: 是他們的選擇或我可以爲此設置?原始套接字將綁定到端口的位置?我錯過了明顯的東西嗎?

謝謝你的時間。

-

回答

3

man page for raw(7)說:

原始套接字可以綁定到使用bind(2)調用的特定本地地址。如果未綁定,則收到所有具有指定IP協議的數據包。另外,可以使用SO_BINDTODEVICE將RAW套接字綁定到特定的網絡設備;見插座(7)。

編輯:您不能將原始套接字綁定到特定端口,因爲「端口」是TCP和UDP中的一個概念,而不是IP。看看這三個協議的頭部圖,它應該變得很明顯:你正在一個較低的層次上工作,在那裏端口的概念是未知的。

+0

因此,爲了確保我正確解釋這一點,我無法綁定到特定的端口?如果是這樣的話,你將如何實施「過濾器」? Libpcap連接到特定的設備並過濾端口,或者因爲這只是一個分配,只需在套接字接收後將其過濾出來?或者你是否有更好的方法來實現?順便謝謝你的回覆和時間。 – user614885 2011-02-14 02:48:26

1

我想你應該過濾軟件中的數據包。聽起來好像練習是通過在用戶空間中重新創建簡化的一部分來了解IP堆棧的不同組件。通常在內核中,IP代碼將處理所有數據包,驗證IP頭,重新組裝片段並檢查協議字段。如果協議字段是17(udp),則它將它傳遞給UDP代碼(每個UDP數據包)。這取決於UDP代碼,然後驗證UDP頭並根據目標端口確定是否有應用程序對其感興趣。

我想你的項目或多或少模仿這個過程。顯然,它們在內核中的效率都不如內核,但是由於分配是在用戶空間中編寫(部分)IP棧,所以我認爲效率不是練習的重點。

相關問題