目前我尝试在go中重新实现一个C应用程序。 C应用程序的一部分是将字符串发送到多播组。这将生成通过tcpdump捕获的以下数据包:
00000000 d4 c3 b2 a1 02 00 04 00 00 00 00 00 00 00 00 00 |................|
00000010 ff ff 00 00 01 00 00 00 14 81 06 56 47 2c 01 00 |...........VG,..|
00000020 46 00 00 00 46 00 00 00 33 33 00 02 10 01 04 ce |F...F...33......|
00000030 ef ca fe 1a 86 dd 60 00 00 00 00 10 11 01 fe 80 |......`.........|
00000040 00 00 00 00 00 00 06 ce ef ff fe ca fe 1a ff 02 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 02 10 01 be 8f |................|
00000060 03 e9 00 10 99 68 6e 6f 64 65 69 6e 66 6f |.....hnodeinfo|
我尝试使用以下代码复制行为:
const MultiCastGroup string = "ff02:0:0:0:0:0:2:1001"
const Port int = 1001
const Proto string = "udp6"
const MaxDataGramSize int = 8192
var announcedAddr = &net.UDPAddr{IP: net.ParseIP(MultiCastGroup), Port: Port}
buf := []byte("nodeinfo")
unicastConn, _ := net.ListenUDP(Proto, &net.UDPAddr{IP: net.IPv6zero, Port: 0})
unicastConn.WriteToUDP(buf, announcedAddr)
但是我不认为它有效,因为我可以通过tcpdump从中捕获所有内容:
00000000 d4 c3 b2 a1 02 00 04 00 00 00 00 00 00 00 00 00 |................|
00000010 ff ff 00 00 01 00 00 00 |........|
00000018
看起来数据包甚至无法发送。我在Debian Wheezy机器上试过这个。有没有人,如果你遇到类似golang和UDP的问题?
提前致谢
答案 0 :(得分:3)
您是否尝试在其他主机上收听?
Go(至少在1.4中)在多播上有一个硬编码的环回禁用。这意味着,您无法看到自己的数据包。您可以通过在套接字FD本身上调用setsockopt来覆盖它,或者:
golang.org/x/net/ipv6库可以为您完成此操作。
或者你可以从Here获取代码(必须找到它来寻找它)