macOS下Python接收UDP广播报Can't assign requested address错误
问题根源
macOS 网络栈继承自BSD,套接字逻辑严格遵循POSIX规范:不允许用户态程序直接绑定受限广播地址255.255.255.255,直接绑定就会触发OSError: [Errno 49] Can't assign requested address错误。
绑定子网广播地址(如192.168.4.255)无法接收目标为255.255.255.255的数据包,原因是255.255.255.255是本地链路级受限广播,内核不会将这类数据包投递到绑定子网广播地址的套接字。
初始代码能在Ubuntu运行,是因为Linux对套接字实现做了自定义扩展,允许直接绑定广播地址,属于平台特有行为,不具备跨平台兼容性。
解决方法
macOS下接收发往255.255.255.255的UDP广播,只需要把绑定地址从广播地址替换为通配地址0.0.0.0即可,其余广播相关配置不需要改动。
可用参考代码:
import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 开启广播权限 server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # 绑定所有本地网卡的目标端口,这是BSD系系统接收全局广播的标准写法 server.bind(('0.0.0.0', 10002)) # 数据接收逻辑 while True: data, addr = server.recvfrom(4096) print(f"收到{addr}发来的广播数据: {data}")
异常处理补充
如果启动时提示端口被占用,可在bind调用前增加端口复用配置:
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
内容的提问来源于stack exchange,提问作者Elliott B
相关产品推荐
相关产品推荐

