hrs*_*hrs 1 python sockets networking
我有一个监听端口的python套接字服务器,并使用以下方法接受所有传入连接:
(conn, address) = socket.accept()
Run Code Online (Sandbox Code Playgroud)
但是,我希望只接受来自某个IP地址的连接.
目前,如果未注册地址,我会关闭连接,以实现此目的.
但有没有更好的方法来做到这一点,直接拒绝来自未注册地址的连接,而不是接受连接然后关闭它们?
无法从某些IP地址指示Connection拒绝客户端,并且无法从其他IP地址建立与客户端的连接.这不是Python限制,而是较低级别的BSD套接字层限制.你甚至不能从C做到这一点.
您可以在Python中执行的最接近的行为是在接受连接后快速关闭连接:
sock, addr = server_socket.accept()
if addr[0] != '12.34.56.78':
sock.close()
return
...
Run Code Online (Sandbox Code Playgroud)
然后客户端将看到连接被接受,并且在此之后不久,客户端在读取它时将看到EOF,并且它将无法写入它.
但是,可以通过以下方法之一在绑定时通过接口(即网卡)进行限制:
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))
Run Code Online (Sandbox Code Playgroud)
因此在127.0.0.1版本中,telnet 127.0.0.1 65432(作为客户端)可以工作,但telnet myhostname 65432会导致Connection拒绝(并且server_socket.accept()调用将不会获得此连接).
| 归档时间: |
|
| 查看次数: |
4964 次 |
| 最近记录: |