如何让 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
这是一个单独的命令,由于 Stack Overflow 的格式限制而拆分。
它说的是 IP 1.2.3.4 的远程机器被允许连接到这台机器上的 TCP 端口 1234。如果您在默认模式下启用了防火墙,它会拒绝未明确允许的流量,那么所有其他计算机的连接尝试都将被丢弃。
在旧版本的 Windows 上,回到 XP,有一个不同的“netsh firewall”语法来获得相同的效果。只需在命令提示符下键入“netsh firewall”即可开始浏览其内置帮助。
关于networking - Winsock,只接受来自特定IP地址的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3290304/