首页 > 解决方案 > 在绑定到特定的 127.xxx 地址时侦听多播环回

问题描述

我想在同一台主机上运行 golang udp 客户端和服务器,客户端可以通过 224.0.0.1 环回多播向服务器发送一些数据。

客户端和服务器都需要绑定回环地址(127.xxx)。我通过添加别名更新了我的网络接口适配器,因此我的网络接口 (lo0) 如下所示,并且配置了 127.0.0.1 和 127.0.0.2:

lo0: flags=8149<UP,LOOPBACK,RUNNING,PROMISC,MULTICAST> mtu 16384
    options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
    inet 127.0.0.1 netmask 0xff000000
    inet6 ::1 prefixlen 128
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
    inet 127.0.0.2 netmask 0xff000000
    nd6 options=201<PERFORMNUD,DAD>

由于某种原因,服务器不接收多播数据,除非我将服务器的 IP 更改为 0.0.0.0。将服务器的 IP 更改为 0.0.0.0 对我不起作用,因为我想在主机上生成几台服务器(在同一端口上),这些服务器将等待来自客户端的多播,并且使用 0.0.0.0 我会遇到冲突

var signalChan = make(chan int)
var terminateChan = make(chan int)

func TestLoopbackMulticast(t *testing.T) {

    go ListenServer(net.IPv4(127, 0, 0, 1))
    go SendFromClient()

    <- terminateChan
}

func SendFromClient() {

    <- signalChan
    time.Sleep(time.Second)
    addr := net.UDPAddr{
        IP:   net.IPv4(127, 0, 0, 2),
    }

    conn, err := net.ListenUDP("udp", &addr)
    if err != nil {
        panic(err)
    }

    defer conn.Close()

    packetConn := ipv4.NewPacketConn(conn)

    ifi, _ := net.InterfaceByName("lo0")
    packetConn.SetMulticastInterface(ifi)
    packetConn.SetMulticastLoopback(true)

    log.Println("sending data to server...")
    sentBytes, err := packetConn.WriteTo([]byte("test"), nil, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 1).To4(),
        Port: 2024})

    if err != nil {
        log.Println("error sending data to server:", err)
    }

    log.Println("sent bytes", sentBytes)
}

func ListenServer(ip net.IP) {
    iff, _  := net.InterfaceByName("lo0")
    addr := net.UDPAddr{
        Port: 2024,
        IP:   ip,
    }


    conn, err := net.ListenUDP("udp", &addr)

    packetConn := ipv4.NewPacketConn(conn)
    err = packetConn.JoinGroup(iff, &net.IPAddr{IP: net.IPv4(224, 0, 0, 1)})

    if err != nil {
        fmt.Println("error joining multicast group:", err)
    }

    signalChan <- 1
    log.Println("waiting for client data...")
    buffer := make([]byte, 2000)
    bytesRead, _, remoteAddr, err := packetConn.ReadFrom(buffer)


    log.Println("Received data from:", remoteAddr)

    if err != nil {
        log.Println(err)
        return
    }

    log.Println(string(buffer[:bytesRead]))


    terminateChan <- 1
}

标签: gonetwork-programmingmulticast

解决方案


推荐阅读