udp多播必须绑定通配地址(如0.0.0.0:5000)并显式指定网卡加入组;否则readfrom阻塞或io.eof,且需setmulticastloopback(true)才能本地接收。

UDP多播必须绑定到 0.0.0.0 或通配地址,不能用具体网卡IP
Go 的 net.ListenMulticastUDP(旧版)或 net.ListenPacket + SetMulticastLoopback(新版)要求监听地址必须是通配地址。如果错误地绑定到 192.168.1.100 这类单播地址,ReadFrom 会始终阻塞或直接返回 io.EOF,因为内核不会把多播包投递给非通配绑定。
- 正确写法:
net.ListenPacket("udp", "0.0.0.0:5000")或net.ListenPacket("udp", "[::]:5000") - 绑定到
localhost:5000或具体 IPv4/IPv6 地址 → 必然失败 - Windows 下若监听成功但收不到包,大概率是防火墙拦截了入站 UDP 多播(不是端口,是协议类型),需手动放行
SetMulticastLoopback 控制本地回环,不设会导致发不出去
默认情况下,Go 的 UDP 连接不启用多播回环(loopback)。这意味着:你发往 224.0.0.1:5000 的包,本机其他 socket 是收不到的 —— 即使它们也加入了该组。这不是 bug,是 POSIX 默认行为。
- 发送前必须调用:
conn.SetMulticastLoopback(true) - 不设 → 本地调试时“发了但收不到”,误以为代码逻辑有问题
- 设为
false仅在跨机器测试时可省略,但本地联调基本必开 - 注意:该方法需在
ListenPacket后、JoinGroup前调用,否则 panic(operation not supported)
加入多播组要用 net.Interface 显式指定网卡,不能靠系统自动选
Linux/macOS 可能有多个活跃网卡(如 Wi-Fi + 以太网 + Docker bridge),net.JoinGroup 若不指定接口,Go 会用默认路由出口网卡 —— 但多播组加入必须精确到接口索引,否则内核不转发对应组流量。
本文档主要讲述的是android rtsp流媒体播放介绍;实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 先查接口:
iface, _ := net.InterfaceByName("en0")(macOS)、"eth0"(Linux) - 再加入:
conn.JoinGroup(iface, &net.UDPAddr{IP: net.ParseIP("224.0.0.1")}) - 用
net.Interfaces()遍历时注意过滤掉lo、docker0等非物理接口,否则可能加入失败(no such device) - Windows 上接口名可能是
"Ethernet"或带空格/中文名,建议用InterfaceByIndex+Routes匹配默认网关所在接口
发送时目标地址必须是多播地址,且 WriteTo 的 UDPAddr 不能含端口以外字段
常见错误是构造目标 *net.UDPAddr 时传入了 Zone(IPv6 scope ID)或 IP 未用 net.ParseIP 解析,导致 WriteTo 返回 invalid argument 或静默丢包。
立即学习“go语言免费学习笔记(深入)”;
- 安全写法:
&net.UDPAddr{IP: net.ParseIP("224.0.0.1"), Port: 5000} - IPv6 多播(如
ff02::1)必须带 Zone,例如:&net.UDPAddr{IP: ip, Port: 5000, Zone: iface.Name} - 不要复用接收用的
UDPAddr实例来发送 —— 它可能含无关字段(如Zone为空字符串)引发 syscall 错误 - 多播地址范围必须合法:
224.0.0.0/4(IPv4)或ff00::/8(IPv6),用239.255.255.255没问题,但240.0.0.1是保留地址,不可用
eth0 往往不是你想象的那个。









