編碼轉向套接字/它們是如何工作的?
轉向套接字與原始 IP 套接字非常相似。它們之間的一個主要區別是,轉向套接字不是繫結到 IP 地址,而是繫結到程式設計師定義的轉向埠,就像原始 IP 套接字一樣。IPFW 程式或其他資料包過濾器用於匹配您希望套接字接收的資料包,一旦匹配到,它就可以轉向或複製資料包。
沒有。複製是將資料包的副本傳送到您的轉向套接字的過程,而轉向則完全阻止資料包繼續向上網路堆疊,並需要應用程式將其重新注入網路堆疊中。如果您只想捕獲資料包,複製通常是一個好主意。
接收傳入和傳出資料包是透過 read()、recv() 和 recvfrom() 呼叫中的任何一個完成的。在最後一個函式中,返回的地址埠是資料包過濾器設定的標籤。在這種情況下,IPFW 會將埠設定為轉向資料包的匹配規則的規則編號。至於 IP 地址欄位,傳入的資料包將觸發將返回的 IP 地址設定為接收資料包的裝置。裝置的 BSD 名稱將放置在地址的最後 8 個位元組中,假設它適合。否則,當接收傳出資料包時,IP 地址將簡單地設定為 INADDR_ANY,並且返回地址的最後 8 個位元組將為 null。
傳送資料包的工作方式與原始 IP 套接字相同。您可以透過使用 write()、send() 或 sendto() 呼叫中的任何一個來透過套接字傳送資料包。在後一種情況下,INADDR_ANY 的目標地址將導致資料包被視為傳出資料包。任何其他地址都將導致資料包被視為傳入資料包。
當原始資料包進入 IP 處理時,很少進行錯誤檢查(就像原始 IP 套接字一樣)。如果您傳送一個具有錯誤 IP 校驗和的資料包,它將傳送一個具有錯誤 IP 校驗和的資料包,並且不會報告任何錯誤。如果您傳送一個數據報長度不正確的資料包,該資料包將被丟棄,並且 errno 將設定為 EINVAL。確保在傳送資料包時沒有錯誤是您的責任,否則它將永遠丟失在網際網路的浩瀚深處。
Send() 更易於使用,但它不允許您明確選擇要傳送的資料包要接收的裝置。如果您毫無頭緒,您想要 send(),節省一些除錯會話。