为了账号安全,请及时绑定邮箱和手机立即绑定

在Golang中,如何接收绑定到特定地址/端口的套接字的多播数据包?

在Golang中,如何接收绑定到特定地址/端口的套接字的多播数据包?

Go
慕容森 2021-12-07 19:40:49
手头的任务是将套接字专门绑定到地址 1.0.0.2:520(分配给 eth2),然后读取地址为 224.0.0.9:520 的多播 UDP 数据包。我正在尝试下面的代码,基于https://godoc.org/golang.org/x/net/ipv4不幸的是,结果是这个调试消息永远不会到达: log.Printf("udpReader: recv %d bytes from %s to %s on %s", n, cm.Src, cm.Dst, ifname)我知道 eth2 正在接收所需的数据包,因为我在其上运行了此数据包嗅探器:sudo tcpdump -n -i eth218:40:28.571456 IP 1.0.0.1.520 > 224.0.0.9.520: RIPv2, Request, length: 2418:40:29.556503 IP 1.0.0.1.520 > 224.0.0.9.520: RIPv2, Response, length: 64这是示例代码。你能发现它为什么不起作用吗?package mainimport (    "fmt"    "log"    "net"    "golang.org/x/net/ipv4")func main() {    if err := interfaceAdd("eth2"); err != nil {        log.Printf("main: error: %v", err)    }    log.Printf("main: waiting forever")    <-make(chan int)}func interfaceAdd(s string) error {    iface, err1 := net.InterfaceByName(s)    if err1 != nil {        return err1    }    addrList, err2 := iface.Addrs()    if err2 != nil {        return err2    }    for _, a := range addrList {        addr, _, err3 := net.ParseCIDR(a.String())        if err3 != nil {            log.Printf("interfaceAdd: parse CIDR error for '%s' on '%s': %v", addr, s, err3)            continue        }        if err := join(iface, addr); err != nil {            log.Printf("interfaceAdd: join error for '%s' on '%s': %v", addr, s, err)        }    }    return nil}func join(iface *net.Interface, addr net.IP) error {    proto := "udp"    var a string    if addr.To4() == nil {        // IPv6        a = fmt.Sprintf("[%s]", addr.String())    } else {        // IPv4        a = addr.String()    }    hostPort := fmt.Sprintf("%s:520", a) // rip multicast port    // open socket (connection)    conn, err2 := net.ListenPacket(proto, hostPort)    if err2 != nil {        return fmt.Errorf("join: %s/%s listen error: %v", proto, hostPort, err2)    }
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

为了创建多个特定于接口的套接字来接收寻址到相同多播地址 (224.0.0.9:520) 的数据包,我的原始 Go 代码缺少三个主要问题:

  1. 为了将多个套接字绑定到同一个 UDP 端口,设置 syscall.SO_REUSEADDR

  2. 为了限制套接字到特定接口,设置 syscall.SO_BINDTODEVICE

  3. 将 UDP 套接字绑定到 0.0.0.0:520

在这里找到完整的示例代码:http : //play.golang.org/p/NprsZPHQmj


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 337 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信