如何使Winsock程序仅接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略而不是被TCP拒绝。
最佳答案
要使Winsock程序仅接受来自特定IP地址的连接,请使用 WSAAccept()
的条件接受机制。首先,启用功能:
SOCKET sd = socket(...);
listen(sd, ...);
DWORD nTrue = 1;
setsockopt(sd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char*)&nTrue, sizeof(nTrue));
然后,将您的accept调用修改为如下所示:
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防火墙”即可开始遍历其内置帮助。
关于networking - Winsock,仅接受来自特定IP地址的请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3290304/