我有一个 python 套接字服务器,它监听一个端口,并使用以下方法接受所有传入连接:
(conn, address) = socket.accept()
但是,我希望只接受来自特定 IP 地址的连接。
目前,如果地址未注册,我将关闭连接以完成此操作。
但是有没有更好的方法来做到这一点,直接拒绝来自未注册地址的连接,而不是接受连接然后关闭它们?
请您参考如下方法:
无法从某些 IP 地址向客户端指示连接被拒绝,并从其他 IP 地址建立到客户端的连接。这不是 Python 限制,而是较低级别的 BSD 套接字层限制。你甚至不能从 C 中做到这一点。
您在 Python 中通常可以做的最接近的行为是在连接被接受后快速关闭连接:
sock, addr = server_socket.accept()
if addr[0] != '12.34.56.78':
sock.close()
return
...
然后客户端会看到连接被接受,不久之后客户端在读取时会看到 EOF,并且无法写入。
但是可以在绑定(bind)时通过接口(interface)(即网卡)进行限制,方法是使用以下方法之一:
server_socket.bind(('', 65432)) # Bind on any interface.
server_socket.bind(('127.0.0.1', 65432)) # Bind on loopback (localhost clients only).
server_socket.bind(('34.56.78.91', 65432))
所以在 127.0.0.1 版本中,telnet 127.0.0.1 65432(作为客户端)可以工作,但是 telnet myhostname 65432 可以yield Connection refused(server_socket.accept() 调用不会获得此连接)。
