簡體   English   中英

如何將Raw Socket綁定到特定端口?

[英]How to bind a Raw Socket to a specific port?

我目前正在從事編程工作。 分配是實現客戶端,網絡仿真器和服務器。 客戶端將數據包傳遞給網絡仿真器,網絡仿真器傳遞給服務器。 反之亦然。 分配的先決條件是我只能使用原始套接字。 所以我將創建自己的IP和UDP標頭。 我用wireshark測試了我的數據包。 它們都是正確的並且格式正確(它可以正確讀取)。

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

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

感謝您的時間。

-

raw(7)手冊頁說:

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

編輯:您不能將原始套接字綁定到特定端口,因為“端口”是TCP和UDP中的概念,而不是IP。 看看這三個協議的標題圖,它應該變得很明顯:你在較低級別工作,其中端口的概念是未知的。

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

我想你的項目預計會或多或少地模仿這個過程。 顯然,它沒有一個像在內核中那樣高效,但由於分配是在用戶空間中寫入(部分)IP棧,我認為效率不是練習的重點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM