2015-09-26 33 views
2

目前我尝试重新实现一个C应用程序。 C应用程序的一部分是将字符串发送到多播组。这将产生通过tcpdump的捕获以下包:Golang不会向组播组发送UDP数据包

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

您有一个称为'socket.JoinGroup'? – nos

+1

@nos您没有加入多播组发送给它。 – EJP

回答

3

您是否尝试在另一主机上收听它?

Go(至少在1.4)有一个硬编码的多播环回禁用。这意味着,你看不到你自己的数据包。

您可以通过插座FD本身调用setsockopt的覆盖此,或:

golang.org/x/net/ipv6库可以为你做这个。

或者你可以从Here代码(有闲逛找到它)