2010-07-20 68 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

相关问题