首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组播环回

组播环回
EN

Stack Overflow用户
提问于 2020-03-04 00:27:40
回答 1查看 74关注 0票数 0

我需要在Go上编写多播侦听器。当我读到它的时候,我面临着twicing数据包的问题。似乎我需要将IP_MULTICAST_LOOP设置为false。在Go中要做到这一点并不容易。

我找到this post了。看起来它应该是可行的。但我还是拿到了同一个主机的副本。应该怎么做呢?

代码语言:javascript
复制
ipAddr, err := net.ResolveUDPAddr("udp", groupAddress)
if err != nil {...}

iface, err := net.InterfaceByName("en0")
if err != nil {...}

conn, err := net.ListenPacket("udp4", groupAddress)
if err != nil {...}

pc := ipv4.NewPacketConn(conn)

if err := pc.JoinGroup(iface, ipAddr); err != nil {...}

if err := pc.SetMulticastLoopback(false); err != nil {...}


if loop, err := pc.MulticastLoopback(); err == nil {...}

buf := make([]byte, 1024)
for {

    n, _, addr, err := pc.ReadFrom(buf)
    if err != nil {...}

    fmt.Printf("recv from %v: [%s] \n", addr, buf[:n])
}
EN

回答 1

Stack Overflow用户

发布于 2020-03-04 23:29:13

最简单的方法是在net包中使用ListenMulticastUDP包装器,实际上已经在另一个中解释过了,所以您可以指向How to set IP_MULTICAST_LOOP on multicast UDPConn in Golang

如果您跟踪ListenMulticastUDP()的实现,您将看到在某个点上它调用了setIPv4MulticastLoopback(fd, false)

如果你需要更高级的东西,ListenMulticastUDP()的文档建议你看看https://godoc.org/golang.org/x/net/ipv4https://godoc.org/golang.org/x/net/ipv6,这两个文档详细介绍了如何在Go中进行多播。

下面是展示如何使用ListenMulticastUDP()的一些最小代码(在MacOS上测试,但与平台无关)

代码语言:javascript
复制
func main() {
    // MDNS (https://en.wikipedia.org/wiki/Multicast_DNS)
    groupAddress := "224.0.0.251:5353"
    ifaceName := "en0"
    if err := run(groupAddress, ifaceName); err != nil {
        fmt.Fprintln(os.Stderr, "error:", err)
        os.Exit(1)
    }
}

func run(groupAddr string, ifaceName string) error {
    iface, err := net.InterfaceByName(ifaceName)
    if err != nil {
        return err
    }

    gaddr, err := net.ResolveUDPAddr("udp", groupAddr)
    if err != nil {
        return err
    }

    conn, err := net.ListenMulticastUDP("udp", iface, gaddr)
    if err != nil {
        return err
    }

    buf := make([]byte, 1024)
    for {
        n, addr, err := conn.ReadFromUDP(buf)
        if err != nil {
            return err
        }
        fmt.Printf("recv %4d bytes from %v\n", n, addr)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60511631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档