2013-06-04 40 views
0

我在做Linux下的Socket編程。有一個問題。 我們如何允許特定的IP地址連接到我們的服務器Linux中的套接字 - serv_addr.sin_addr.s_addr = INADDR_ANY;

例如:

  • 允許10.0.0.1
  • 拒絕10.0.0.1

我特別談到代碼此行,我們填補INADDR_ANY我們SOCKADDR_IN結構

serv_addr.sin_addr.s_addr = INADDR_ANY; 
僅供參考守則

休息:

struct sockaddr_in serv_addr; 


serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = INADDR_ANY; // Here's my question!! 
serv_addr.sin_port = htons(portno); 
+1

我有點生疏,但不是'serv_addr'服務器套接字?如在,它是你用來聽的TCP套接字?在你參考的那一行中,這只是設置要監聽的接口的IP地址,而不是連接的內容。 – austin

+0

@austin其實'serv_addr'是包含服務器信息的結構。端口號,允許的IP地址,TCP/IP v4/v6等。 是的,它允許所有連接被接受。我想要的是限制到特定的IP。 Btw,Listening和Accepting在這一步之後完成。 – Safeer

+0

Austin的絕對正確:如果serv_addr用於綁定偵聽套接字,則不能在此處放置對等方的IP地址。 –

回答

1

這就是所謂的防火牆。在linux上,你使用iptables(8)來設置它。

如果你想在你的應用程序中這樣做,不可能根據對方的地址有選擇地收聽(你只能根據你的地址有選擇地收聽,如果你在Linux上使用「弱端系統模型「,你必須檢查你是否明白這意味着什麼!---聽一個特定的地址可能並不完全符合你的期望,並且不是一個安全的方式來丟棄來自不可信接口的數據包)。

取而代之的是,在INADDR_ANY上偵聽,然後在接受的fd上調用getpeername(2),驗證它,並關閉與應用程序過濾器不匹配的連接。

+0

這是我從未嘗試過的東西。看起來也可行,也很容易。但仍然出於知識的目的,在我的代碼方法中,實際選擇的IP如何被允許。 – Safeer

+0

對不起,我不太明白你在問什麼。如果你想要一種綁定套接字的方式來接受來自特定IP地址的連接,你不能。這對套接字API來說是不可能的。你必須聽所有的連接,然後關閉你不想要的連接,正如我在最後一段中所描述的那樣。你的代碼的方法聽起來像不起作用。 –

+0

好的。得到它了。謝謝! – Safeer