2010-07-20 137 views
2

如何讓Winsock程序只接受來自特定地址的連接請求?我想拒絕連接被完全忽略,而不是得到TCP拒絕。Winsock,只接受來自特定IP地址的請求

+0

問你是否可以將winsock配置爲拒絕來自不受歡迎地址的流量,或者如何編寫使用winsock拒絕來自不期望地址的流量的軟件? – Avalanchis 2010-07-20 13:47:14

回答

7

要使Winsock程序只接受來自特定IP地址的連接,請使用WSAAccept()的條件接受機制。首先,啓用該功能:

SOCKET sd = socket(...); 
listen(sd, ...); 
DWORD nTrue = 1; 
setsockopt(sd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char*)&nTrue, sizeof(nTrue)); 

然後,修改你的接受調用看起來像這樣:

sockaddr_in sin; 
WSAAccept(sd, (sockaddr*)&sin, sizeof(sin), ConditionalAcceptChecker, 0); 

ConditionalAcceptChecker是你寫一個函數,這使得有關堆棧是否會接受還是決定拒絕連接。如果它拒絕它,遠程節點將得到一個TCP RST數據包,所以它知道它被拒絕了。

如果您希望網絡堆棧在不通知遠程對等方的情況下悄悄丟棄來自其他地址的連接嘗試,則必須在比Winsock更低的級別上執行此操作。在Vista或Windows Server 2008及以上版本,此命令將修改防火牆規則給你想要的效果:

netsh advfirewall firewall add rule name=MyProtocol dir=in remoteip=1.2.3.4 
            localport=1234 protocol=tcp action=allow 

這是一個簡單的命令,因爲拆分對堆棧溢出格式限制。

它說的是允許IP 1.2.3.4的遠程機器連接到本機上的TCP端口1234。如果您的默認模式啓用了防火牆,並拒絕了未明確允許的流量,則所有其他機器的連接嘗試將被丟棄。

在老版本的Windows上,回到XP,有一個不同的「netsh防火牆」語法獲得相同的效果。只需在命令提示符下鍵入「netsh防火牆」以開始瀏覽其內置幫助。

+0

如果winsock可以配置爲不拒絕,但丟棄來自不期望地址的流量 – user396829 2010-07-21 13:09:21

+0

上面更新的答案覆蓋了防火牆級接受/拒絕控制。 – 2010-07-21 14:58:00

+0

+1,不知道'WSAAccept'中的特徵 – Default 2010-08-12 11:45:21

相關問題