我创建了一个服务器套接字,并指定要侦听的端口12345
,并允许连接请求通过INADDR_ANY
传递到系统上的任何可用IP地址。 bind()
。这是服务器套接字的值:
我的问题是,我可以指定允许哪个IP地址和端口号向我发送连接请求(即上图中外地址中的值)?
答案 0 :(得分:1)
您无法一劳永逸地指定""打开侦听套接字时,如果它们不是源自您想要的IP,则可以拒绝单个连接。 WSAAccept function允许您指定条件函数,该函数决定是否接受连接。
这可以单独使用,但我不确定是否以这种方式拒绝连接与接受它并立即关闭它,也许你需要设置套接字选项SO_CONDITIONAL_ACCEPT
,在打开之前拒绝连接
See also this Q/A
答案 1 :(得分:0)
是的,你可以。这就是防火墙的原因。您可以配置某些规则,例如仅允许某个IP地址进行连接。 Windows有一个集成的防火墙,你的路由器也配备了。
您无法在程序中指定这些限制。
答案 2 :(得分:0)
接受连接后,您将获得外部IP地址。如果你不喜欢这种连接,你可以自由地关闭接收套接字。
答案 3 :(得分:0)
在本地无源OPEN和外部有源OPEN中有两种匹配套接字的主要情况。在第一种情况下,本地无源OPEN已完全指定了外部套接字。在这种情况下,匹配必须准确。在第二种情况下,本地无源OPEN未指定外部套接字。在这种情况下,只要本地套接字匹配,任何外部套接字都是可接受的。其他可能性包括部分受限比赛。
这是RFC793中的简介。在实际的实现中,例如@alain,可以在Windows系统中使用SO_CONDITIONAL_ACCEPT。 Linux系统中没有此类API,您可以在调用accept之后判断是否允许IP和端口,并且不允许直接断开连接。