[英]Few queries regarding raw sockets in C
我想使用C中的原始套接字建立一個聊天室。我有以下問題:
問1:如果使用原始套接字,是否可以使用select函數處理多個連接?
問題2:套接字中的端口號是真實端口,還是為傳輸層上的各種應用程序邏輯實現的?
問題3:我只有一台計算機,因此使用lo(本地循環)作為界面。 因此,發起聊天的過程首先發送然后接收呼叫,因此它正在接收自己的數據。 如何限制呢?
任何幫助將不勝感激,因為這將幫助我增加對原始套接字的信心。
謝謝 :)
如果您希望這是一個真實的可用聊天系統,請停止 。 不要使用原始套接字。 巨大的錯誤。
如果您只是想在簡歷的“體驗”部分下放置“原始套接字”,那么您可以繼續閱讀。
您可以使用select函數來檢測原始套接字何時有可接收的數據包,以及何時可以接受要傳輸的數據包。 您可以將多個文件描述符傳遞給單個調用,以select
是否要同時檢查多個原始套接字(或其他)。
端口號是TCP和UDP協議(和某些其他傳輸層協議)的一部分。 接收原始套接字的數據包時,內核不查找端口號。
raw(7)
手冊頁 ,指出:
與原始套接字指定的協議號匹配的所有數據包或錯誤都將傳遞到此套接字。
它還指出:
可以使用
bind(2)
調用將原始套接字綁定到特定的本地地址。 如果未綁定,則將接收所有具有指定IP協議的數據包。
因此,您可能希望至少對“連接”的每一端使用不同的IP地址,並將每一端綁定到其地址。
“但是!”您說,“我正在使用環回! 我只能使用127.0.0.1地址!”朋友,不是。 整個127.0.0.0/8地址塊被保留用於回送地址。 127.0.0.1僅僅是最常用的回送地址。 Linux(但可能不是其他系統)對回送塊中的每個地址作出響應。 在一個窗口中嘗試:
nc -v -l 10150
然后在另一個窗口中:
nc -s 127.0.0.1 127.0.0.2 10150
您將看到已經創建了從127.0.0.1到127.0.0.2的TCP連接。 我認為您也可以將原始套接字綁定到單獨的地址。 然后,當您收到一個數據包時,可以檢查它是否來自另一端的IP地址,以決定是處理還是丟棄它。
只是好奇,為什么要使用原始套接字? 原始套接字( AF_INET
, SOCK_RAW
)允許您發送“原始”數據包,您可以在其中負責制作MAC和IP層以外的所有內容。
A1:沒有與原始套接字的“連接”。 只是包。
A2:沒有帶有原始套接字的“端口”。 只是包。 我們所知道的“端口號”是TCP或UDP協議的一部分,兩者均高於我們使用原始套接字的級別。
A3:這不是特定於原始套接字-無論您選擇哪種協議,都會出現此問題。 要真正回答這個問題,我們需要了解有關您提議的協議的更多信息,因為現在您只是爆破原始IP數據包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.