树莓派作为Socket客户端连接笔记本服务器时出现路由不可达错误求助
树莓派Socket客户端连接笔记本服务器报错:No route to host
错误信息
OSError: [Errno 113] No route to host
客户端代码(树莓派端 client.py)
import socket HOST = '192.168.0.107' PORT = 5353 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.send(b'Hello, world') data = s.recv(1024) print('Received', repr(data))
服务器代码(笔记本端 server.py)
hostname = socket.gethostname() HOST = socket.gethostbyname(hostname) print(HOST) PORT = 5353 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', PORT)) s.listen(1) conn, addr = s.accept() with conn: print('Connected by', addr) print(conn) while True: data = conn.recv(1024) print(data) if not data: break conn.sendall(data)
服务器端(笔记本)网络信息
enp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.107 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::ab65:70bf:9921:1d4b prefixlen 64 scopeid 0x20<link> ether 18:31:bf:51:9d:9c txqueuelen 1000 (Ethernet) RX packets 213759 bytes 177479962 (169.2 MiB) RX errors 0 dropped 27 overruns 0 frame 0 TX packets 144335 bytes 25485658 (24.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 43423 bytes 3729254 (3.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 43423 bytes 3729254 (3.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
反向连接正常
树莓派作为服务器、笔记本作为客户端时,消息可正常发送。
树莓派端防火墙状态(sudo ufw status)
Status: active To Action From -- ------ ---- SSH ALLOW Anywhere OpenSSH ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere 443/tcp ALLOW Anywhere 5353 ALLOW Anywhere 5353/tcp ALLOW Anywhere SSH (v6) ALLOW Anywhere (v6) OpenSSH (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6) 5353 (v6) ALLOW Anywhere (v6) 5353/tcp (v6) ALLOW Anywhere (v6)
树莓派端监听端口(netstat -lntu)
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 :::53 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN udp 0 0 0.0.0.0:33841 0.0.0.0:* udp 0 0 0.0.0.0:53 0.0.0.0:* udp 0 0 0.0.0.0:68 0.0.0.0:* udp 0 0 0.0.0.0:631 0.0.0.0:* udp 0 0 0.0.0.0:5353 0.0.0.0:* udp6 0 0 :::48624 :::* udp6 0 0 :::53 :::* udp6 0 0 :::5353 :::*
已尝试操作
- 执行
sudo ufw allow 5353/tcp开放端口,无效 - 重置UFW规则,重新添加规则后禁用再启用UFW,问题仍存在:
sudo ufw allow SSH sudo ufw allow OpenSSH sudo ufw allow 80 sudo ufw allow 443 sudo ufw allow 5353/tcp
解决方法
检查并配置笔记本服务器的防火墙
树莓派作为客户端连接笔记本,需要笔记本的防火墙允许5353端口的TCP入站连接:- Linux笔记本:执行
sudo ufw allow 5353/tcp,再运行sudo ufw reload生效 - Windows笔记本:打开「Windows Defender防火墙」→「高级设置」→添加入站规则,允许TCP端口5353的连接
- Linux笔记本:执行
验证网络连通性
在树莓派终端执行ping 192.168.0.107,如果丢包说明两者不在同一局域网或IP有误,检查WiFi连接、路由器设置。修正服务器绑定配置
服务器代码中s.bind(('', PORT))虽能绑定所有网卡,但可手动指定绑定笔记本的局域网IP(192.168.0.107),避免hostname解析异常:HOST = '192.168.0.107' PORT = 5353 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen(1) # 后续代码不变检查端口占用情况
在笔记本执行netstat -tulpn | grep 5353,确认5353端口是否被其他程序占用,若占用则更换端口(如5354)测试。临时关闭防火墙排查
临时关闭笔记本的防火墙,再运行服务器和客户端代码,若能连接成功,说明是防火墙规则配置问题,重新调整入站规则即可。
内容的提问来源于stack exchange,提问作者Kate Mosolova
相关产品推荐
相关产品推荐

