我需要发送一个UDPv6数据报,能够通过本地接收者(或通过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(根据ifconfig
我的IPv6地址)时,会发生同样的情况。
答案 0 :(得分:3)
在这两种情况下(链路本地和接口本地多播),您忘记指定范围ID。如果没有这个,就无法确定使用哪个接口,并且您从操作系统中收到Invalid argument
错误。
net.UDPAddr
使用Zone
字段存储范围ID。您需要确保提供了一个,方法是明确设置Zone
或使用percent-suffix notation。