多播在 golang 中的 Linux 上不起作用

多播在 golang 中的 linux 上不起作用

php小编新一,今天要和大家讨论的是在golang中多播在Linux上不起作用的问题。多播是一种网络通信方式,可以在一个发送者和多个接收者之间传输数据。然而,在golang中,我们可能会遇到在Linux操作系统上多播不起作用的情况。本文将解释为什么会出现这个问题,并提供可能的解决方案。让我们开始吧!

问题内容

此代码发送和接收多播包。

此代码适用于 windows 10,但不适用于 linux:为什么?

已发送打包内容(ip 230.0.0.1,目标端口 9001),但应用程序未接收多播

立即学习“go语言免费学习笔记(深入)”;

数据包(ip 230.0.0.2,目标端口 9002)。

问题是什么?

为了测试我的应用程序,我使用了 linux vm:也许,这就是原因?

package mainimport (    "net"    "os"    "strconv"    "time"    "github.com/rs/zerolog"    "golang.org/x/net/ipv4")const device1_tx_multicastAddr = "230.0.0.1"const device1_tx_udp_port = 9001const device2_tx_multicastAddr = "230.0.0.2"const device2_tx_udp_port = 9002const packetTxDelayMs = 1000// const ethName = "Ethernet" // Windowsconst ethName = "eth0" // Linuxconst modeDevice2 = false // Device 1//const modeDevice2 = true // Device 2var logConsole zerolog.Loggerfunc main() {    logConsole = zerolog.New(os.Stderr).With().Timestamp().        Str("module", "main").        Logger().Output(zerolog.ConsoleWriter{Out: os.Stderr}).        Level(zerolog.InfoLevel)    // **********************************    // Initialize Tx    localInterface := getInterfaceByName(ethName)    logConsole.Info().Str("func", "main").Msg("localInterface: " + ethName)    tx_multicastAddr := device1_tx_multicastAddr    rx_multicastAddr := device2_tx_multicastAddr    tx_udp_port := device1_tx_udp_port    rx_udp_port := device2_tx_udp_port    if modeDevice2 {        tx_multicastAddr = device2_tx_multicastAddr        rx_multicastAddr = device1_tx_multicastAddr        tx_udp_port = device2_tx_udp_port        rx_udp_port = device1_tx_udp_port    }    logConsole.Info().Str("func", "main").Msg("Open Tx UDP port " + tx_multicastAddr + ":" + strconv.Itoa(tx_udp_port) + "...")    remoteDeviceUdpAddr, err := net.ResolveUDPAddr("udp4", tx_multicastAddr+":"+strconv.Itoa(tx_udp_port))    if err != nil {        panic(err)    }    localDeviceUdpAddr, err2 := net.ResolveUDPAddr("udp4", localInterface.String()+":"+strconv.Itoa(rx_udp_port))    if err2 != nil {        panic(err2)    }    logConsole.Info().Str("func", "main").Msg("Listen UDP: " + localDeviceUdpAddr.String() + "...")    localDevice, err2 := net.ListenUDP("udp4", localDeviceUdpAddr)    if err2 != nil {        panic(err2)    }    // **********************************    // Initialize Rx    udpReceiver := ipv4.NewPacketConn(localDevice)    ief, errInterface := net.InterfaceByName(ethName)    if errInterface != nil {        localDevice.Close()        panic(errInterface)    }    logConsole.Info().Str("func", "main").Msg("Join Multicast: " + rx_multicastAddr + "...")    err = udpReceiver.JoinGroup(ief, &net.UDPAddr{IP: net.ParseIP(rx_multicastAddr)})    if err != nil {        localDevice.Close()        panic(err)    }    // **********************************    // Run Rx/Tx tasks    go sendData(localDevice, remoteDeviceUdpAddr, packetTxDelayMs)    receivedData(udpReceiver)}// *************************************************func sendData(localDevice *net.UDPConn, remoteDeviceUdpAddr *net.UDPAddr, packetDelay uint) {    data := []byte("1234567890")    for {        //logConsole.Info().Str("func", "sendData").Msg("Send...")        _, err := localDevice.WriteTo(data, remoteDeviceUdpAddr)        if err != nil {            panic(err)        }        time.Sleep(time.Duration(packetDelay) * time.Millisecond)    }}func receivedData(receiver *ipv4.PacketConn) {    buf := make([]byte, 1500)    for {        n, _, _, err := receiver.ReadFrom(buf)        if err == nil {            logConsole.Info().Str("func", "receivedData").Msg("Receive Data: " + string(buf[0:n]))        }    }}// *************************************************func getInterfaceByName(name string) net.IP {    ief, err := net.InterfaceByName(name)    if err != nil {        panic(err)    }    addrs, err := ief.Addrs()    if err != nil {        panic(err)    }    var ipAddr net.IP    for _, addr := range addrs {        ipAddr = addr.(*net.IPNet).IP.To4()        if ipAddr != nil {            break        }    }    if ipAddr == nil {        panic("ipAddr is nil")    }    return ipAddr}

登录后复制

解决方法

修改应用程序以侦听以下 ip 地址之一将使其在 linux 和 macos 上运行:

多播组的ip地址(问题中的rx_multicastaddr)通配符地址 (0.0.0.0)。

但尚不清楚当它侦听 nic 的 ip 地址(例如 192.168.0.5)时是否可以工作。根据我的测试和问题中的描述,它可以在 windows 上运行,但不能在 linux 或 macos 上运行。我还找不到描述这种行为的权威来源。

下面是一个接受标志的简化演示。

在设备 1 上,使用以下命令运行它(将接口名称替换为您的设备的名称):

go run . -listen 230.0.0.1:9001 -join 230.0.0.1:9001 -send 230.0.0.2:9002 -ifname eth0

登录后复制

在设备 2 上,使用以下命令运行它(将接口名称替换为您设备的接口名称):

go run . -listen 0.0.0.0:9002 -join 230.0.0.2:9002 -send 230.0.0.1:9001 -ifname ethernet

登录后复制

package mainimport (    "flag"    "log"    "net"    "time"    "golang.org/x/net/ipv4")var (    listen string    join   string    send   string    ifname string)func main() {    flag.StringVar(&listen, "listen", "230.0.0.1:9001", "")    flag.StringVar(&join, "join", "230.0.0.1:9001", "the multicast group address to receive data from")    flag.StringVar(&send, "send", "230.0.0.2:9002", "the multicast group address to send data to")    flag.StringVar(&ifname, "ifname", "eth0", "the name of the interface")    flag.Parse()    itf, err := net.InterfaceByName(ifname)    if err != nil {        panic(err)    }    groupAddr, err := net.ResolveUDPAddr("udp4", join)    if err != nil {        panic(err)    }    c, err := net.ListenPacket("udp4", listen)    if err != nil {        panic(err)    }    defer c.Close()    p := ipv4.NewPacketConn(c)    if err := p.JoinGroup(itf, &net.UDPAddr{IP: groupAddr.IP}); err != nil {        panic(err)    }    log.Printf("join multicast group %s, waiting...", join)    go sendData(c, send)    receivedData(p)}func sendData(c net.PacketConn, target string) {    data := []byte(ifname)    addr, err := net.ResolveUDPAddr("udp4", target)    if err != nil {        panic(err)    }    for {        _, err := c.WriteTo(data, addr)        if err != nil {            panic(err)        }        time.Sleep(time.Second)    }}func receivedData(receiver *ipv4.PacketConn) {    buf := make([]byte, 1500)    for {        n, _, _, err := receiver.ReadFrom(buf)        if err == nil {            log.Printf("Receive Data from: %s", buf[0:n])        }    }}

登录后复制

以上就是多播在 golang 中的 Linux 上不起作用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2355824.html

(0)
上一篇 2025年3月1日 15:28:08
下一篇 2025年3月1日 15:28:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • hosts文件修改后无法保存

    hosts文件是一种用来映射ip地址和主机域名的文本文件,用于解决域名解析问题。在某些情况下,我们可能需要对hosts文件进行修改,添加或删除一些条目。然而,有时候我们可能会遇到hosts文件修改后无法保存的问题。本文将探讨这个问题可能出现…

    互联网 2025年3月1日
    100
  • 组装电脑配置? 网吧电脑如何组装?谢谢?

    组装电脑配置时遇到难题?网吧电脑的组装流程也让你一头雾水?php小编西瓜特别为你奉上全面而实用的组装电脑配置和网吧电脑组装指南。无论你是初学者还是经验丰富的玩家,这份详细指南都能帮助你轻松应对电脑组装过程。 组装电脑配置? CPU 内存 主…

    2025年3月1日
    100
  • 组装电脑报价单? 联想一体机电脑报价多少?

    组装电脑需要考虑哪些因素?不同配置的价格相差多少?联想一体机电脑的报价又是如何呢?php小编苹果将为您一一介绍,帮助您轻松了解组装电脑和一体机电脑的价格信息。详细内容请继续阅读: 组装电脑报价单? 以8000元高配置电脑为例: 配件名称 品…

    2025年3月1日
    100
  • 如何将 dbus/systemd 设置为 systemd 单元中的依赖项

    php小编小新将为您介绍如何将DBus/Systemd设置为Systemd单元的依赖项。DBus和Systemd是Linux操作系统中常用的两个工具,DBus用于进程间通信,而Systemd则负责系统初始化和进程管理。将DBus和Syste…

    2025年3月1日
    200
  • 电脑硬件常见故障及排查方法

    当你的电脑出现各种问题时,如何快速诊断故障并自行解决呢?php小编百草为大家整理了电脑硬件常见故障的排查方法,涵盖了各类常见问题,如开机无显示、蓝屏死机、内存条故障等。通过深入浅出的故障分析和详细的排查步骤,让你轻松掌握电脑硬件维护技巧,有…

    2025年3月1日
    200
  • 详细解读:如何在不同操作系统中安装Golang环境

    在不同操作系统中安装Golang环境 Go语言是一种相对年轻但备受推崇的编程语言,它具有高效的编译速度和强大的并发特性,因此在软件开发领域广受欢迎。本文将详细介绍如何在不同操作系统中安装Go语言环境,并提供具体的代码示例。我们将分别介绍在W…

    2025年3月1日
    200
  • 电脑安全软件哪个好用?

    电脑安全软件哪家强?作为电脑用户的你是否在为选择一款合适的安全软件而烦恼?php小编西瓜为大家整理了市面上最热门的几款安全软件,并详细介绍了它们的优点和缺点,让你轻松做出选择。一起来看看吧! 一、电脑安全软件哪个好用? 安全软件,我现在基本…

    2025年3月1日
    200
  • “轻松下载Golang安装包:详细指南,一键完成”

    Golang安装包下载完全指南 随着Golang的流行,越来越多的开发者开始关注和学习这门语言。不过,对于一些初学者来说,Golang的安装包下载和配置可能会成为一个困扰。今天,我们将为大家带来一篇Golang安装包下载的完全指南,让你无需…

    2025年3月1日
    200
  • 键盘错乱

    键盘错乱,又称按键冲突,会影响我们的正常输入,十分让人苦恼。php小编西瓜今天就来介绍这个问题,分析键盘错乱产生的原因,并提供行之有效的解决方法。如果你正在为键盘错乱烦恼,不妨往下阅读本文,找到适合你的解决之道。 一、键盘错乱 键盘错乱解决…

    2025年3月1日
    200
  • 电脑开wifi给手机用

    当外出时,使用手机连接电脑的 wi-fi 热点可以节省流量。php小编西瓜将详细介绍如何使用电脑建立 wi-fi 热点,让您轻松将互联网连接共享给您的手机。阅读以下内容,了解分步指南,轻松实现在电脑上设置 wi-fi 热点,让您的手机随时随…

    2025年3月1日
    200

发表回复

登录后才能评论