Skip to main content
 首页 » 编程设计

Python 套接字服务器 : Reject connection from address

2025年05月04日17shanyou

我有一个 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() 调用不会获得此连接)。