2012-06-25 39 views
0

我試圖用C編寫一個服務器 - 客戶套接字的程序。目標是讓服務器監聽特定的端口,但是通過IP地址範圍的屬於相同的IP子網。此IP子網是127.x.x.x範圍(當然不是127.0.0.1)的一部分。在C/Unix的IP子網上監聽的套接字

幾點要注意:

  • 這是一個基於流的插孔,而不是數據報套接字。
  • 這不是廣播地址。
  • 實現在只在Unix/Linux平臺

我不想在服務器範圍內的每個IP地址上打開多個套接字C/C++。這不可擴展。

任何幫助將理想的讚賞。這是否可行?

+0

AFAIK在Windows中是不可能的。 –

+0

這是用於Unix/Linux的。應該在我的子彈列表中提到它,但認爲它已經在標題中。 – viv

回答

4

您只能綁定到一個套接字上的一個地址。爲什麼你不能綁定到INADDR_ANY,只是拒絕任何沒有綁定到你的目標IP地址的數據包?或者,您可以綁定到任意端口並使用OS級別的魔術(例如iptables,bpf)將目的地爲這些IP /端口組合的數據包重新路由到您的套接字。

+0

感謝您的建議。您能否詳細說明_「拒絕任何未綁定到您的目標IP的數據包」_?這是否必須通過檢查每個傳入數據包上的標題在我的代碼中完成? – viv

+2

@Vivek:不,因爲它是一個基於流的套接字 - 您只需要在由accept()返回的套接字上調用getpeername(),並檢查它是您想要使用的地址之一。 – caf

+0

道歉,我誤解並認爲你使用的是UDP。 caf的建議是TCP套接字的正確API。 –

1

套接字API不允許綁定到子網 - 您可以綁定到一個IP或任何 IP。您可以監聽所有入站連接並拒絕那些不適用的連接。如果您需要在同一臺服務器上的進程之間分配連接,請使用單個監聽套接字,並將傳入連接傳輸到工作進程。

+0

謝謝。在這種情況下,不涉及工作進程。這個要求源於套接字必須在特定IP上打開的強制安全約束。實際的IP地址本質上是動態的。因此,我沒有動態地試圖確定打開哪個IP,而是在檢查基於子網的方法是否可行。 – viv

+0

如果這確實是一個安全約束條件,那麼也許你的團隊應該重新審視這個決定,並試圖找出他們認爲他們正在購買什麼類型的安全性。 – tylerl

0

您可以使用防火牆來阻止任何來自所需子網之外的人連接(即在o/s級別)。您可以將套接字置於混雜模式並接受給定接口上的所有連接。我不知道你是否可以做到這兩點(在混雜模式下有一個套接字並在其上運行iptables)。本質上就像構建一個只偵聽一個端口的數據包嗅探器。