我需要发送一个UDPv6数据报,以便能够通过本地接收方(或通过tcpdump)跟踪此消息。
tcpdump
daddr, err = net.ResolveUDPAddr("udp6", "[address]:port") if err != nil { return err } conn, err := net.DialUDP("udp6", nil, daddr) if err != nil { return err } defer conn.Close() conn.Write(...)
与IPv4不同,此代码不适用于IPv6。例如,当我尝试将数据报发送到多播地址,例如[FF01 :: DB8:0:0]:5000时,我得到了connect: invalid argument。当我尝试将其发送到[fe80 :: 20c:29ff:fee1:d66]:5000(根据的我的IPv6地址ifconfig)时,也会发生同样的情况。
connect: invalid argument
ifconfig
在这两种情况下(链路本地和接口本地多播),您都忘记了指定作用域ID。没有这个,就不可能确定要使用哪个接口,并且您会Invalid argument从操作系统中得到一个错误。
Invalid argument
net.UDPAddr使用该Zone字段存储范围ID。您需要通过Zone显式设置或使用百分比后缀表示法来确保已提供了一个。
net.UDPAddr
Zone