Networking Winsock,仅接受来自特定IP地址的请求

Networking Winsock,仅接受来自特定IP地址的请求,networking,winsock,firewall,Networking,Winsock,Firewall,如何使Winsock程序只接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略,而不是被TCP拒绝。要使Winsock程序只接受来自特定IP地址的连接,请使用的条件接受机制。首先,启用该功能: SOCKET sd = socket(...); listen(sd, ...); DWORD nTrue = 1; setsockopt(sd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char*)&nTrue, sizeof(nTrue)); 然后,修改您

如何使Winsock程序只接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略,而不是被TCP拒绝。

要使Winsock程序只接受来自特定IP地址的连接,请使用的条件接受机制。首先,启用该功能:

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 firewall”即可开始浏览其内置帮助。

您是否询问是否可以将winsock配置为拒绝来自不需要的地址的流量,或者如何编写使用winsock拒绝来自不需要的地址的流量的软件?如果可以将winsock配置为不拒绝,但是丢弃来自不需要的地址的流量更新了上面的答案,以覆盖防火墙级别的接受/拒绝控制。