You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PC可作为UDP客户端但无法作为UDP服务端的原因排查

问题背景
  • 组网配置:树莓派与PC接入同一手机热点,PC IP为192.168.78.1,树莓派IP为192.168.78.57,使用Python脚本测试UDP 5005端口双向通信
  • 测试逻辑:客户端向服务端发送固定消息,服务端收到后返回响应
  • 测试结果:
    • 树莓派运行服务端、PC运行客户端时通信正常
    • PC运行服务端、树莓派运行客户端时通信失败:PC服务端阻塞在data,addr = sock.recvfrom(4096)持续等待消息,树莓派客户端阻塞在client_socket.sendto(message.encode("utf-8"),(UDP_IP,UDP_PORT))无法完成发送
  • 测试使用的脚本如下:
    1. UDP服务端脚本
    import socket
    
    UDP_IP = '192.168.78.1'       #Used when PC is server
    #UDP_IP = '192.168.78.57'     #Used when RasPi is server
    UDP_PORT = 5005
    
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.bind((UDP_IP,UDP_PORT))
    
    data,addr = sock.recvfrom(4096)
    print(str(data))
    message = "Hello, I am the UDP Server"
    sock.sendto(message.encode("utf-8"), addr)
    sock.close()
    
    1. UDP客户端脚本
    import socket
    UDP_IP = '192.168.78.1'       #Used when PC is server
    #UDP_IP = '192.168.78.57'     #Used when RasPi is server
    UDP_PORT = 5005
    
    client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    message = 'Hi, this is a client'
    
    client_socket.sendto(message.encode("utf-8"),(UDP_IP,UDP_PORT))
    data,addr = client_socket.recvfrom(4096)
    print('Server Says')
    print(str(data))
    client_socket.close()
    
故障根因

该异常的核心诱因是PC端系统防火墙的公共网络拦截规则,具体链路逻辑:

  • 手机热点默认会被Windows等桌面操作系统识别为「公共网络」,这类网络配置下防火墙默认开启最高防护等级,一方面拦截所有未被显式允许的入站流量,另一方面默认开启「网络隐身模式」,直接丢弃同网段其他设备发来的ARP请求,不返回任何响应
  • UDP的sendto()调用并非永远无阻塞:当内核协议栈无法通过ARP获取目标IP对应的MAC地址时,会持续等待ARP响应,直接阻塞在发送调用上。这就是树莓派客户端卡在sendto行的直接原因:树莓派要向192.168.78.1发送数据包,首先要发送ARP广播查询该IP对应的MAC地址,PC端防火墙直接丢弃ARP请求,树莓派无法获取MAC地址,根本无法完成以太网帧封装、把数据包发出去,PC端自然也收不到任何消息,一直阻塞在recvfrom调用上
  • 反向场景(树莓派当服务端)能正常通信的原因:树莓派系统默认防火墙规则不会拦截同网段入站流量和ARP请求,PC作为客户端发出的请求可以正常到达树莓派,链路连通性正常
  • 现有脚本存在一处兼容性隐患(非本次故障直接原因):服务端绑定IP写死为具体网卡地址,后续设备切换网络、IP变动时会导致服务端启动失败,通用写法是绑定0.0.0.0监听所有网卡的对应端口。
验证与修复方案
  • 连通性验证:在树莓派上执行ping 192.168.78.1,如果所有请求超时,即可确认是PC端防火墙/网络配置拦截导致
  • 故障确认:临时关闭PC端公共网络防火墙后重新运行脚本,如果通信恢复,可100%定位为防火墙规则问题
  • 长期修复:不建议长期关闭防火墙,只需在PC防火墙添加入站规则,允许UDP 5005端口接收同网段流量,同时关闭公共网络配置下的「隐身模式」,允许响应同网段ARP请求即可
  • 脚本优化:将服务端的绑定IP修改为0.0.0.0,适配多网卡、IP变动场景,修改后的绑定代码如下:
sock.bind(('0.0.0.0', UDP_PORT))

内容的提问来源于stack exchange,提问作者Ashley do Rego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:54:19