如何让Winsock程序仅接受来自特定地址的连接请求?我希望拒绝完全忽略连接,而不是获得TCP拒绝。
答案 0 :(得分: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
这是一个单独的命令,由于Stack Overflow上的格式限制而被拆分。
它说的是允许IP 1.2.3.4的远程机器连接到这台机器上的TCP端口1234。如果您在默认模式下启用了防火墙,拒绝未明确允许的流量,则将删除所有其他计算机的连接尝试。
在旧版本的Windows上,回到XP,有一种不同的“netsh firewall”语法可以获得相同的效果。只需在命令提示符下键入“netsh firewall”即可开始浏览其内置帮助。