Cannot receive response packets from multicast server in golang

Viewed 48

I setup a udp server listening multicast trafic, and create a client to sent test packet. When the server receives the package, it will send a response. Everything is ok, except the client cannot receive the packet from the server. Why?

package main

import (
    "log"
    "net"
    "os"
    "time"

    "golang.org/x/net/ipv4"
)

func SetupMulticast(ifn, addr string) {
    ifi, err := net.InterfaceByName(ifn)
    if err != nil {
        log.Fatal(err)
    }
    //server
    c, err := net.ListenPacket("udp4", addr)
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("listen ad:%s\n", addr)
    p := ipv4.NewPacketConn(c)

    gAddr, err2 := net.ResolveUDPAddr("udp4", addr)
    if err2 != nil {
        log.Fatal(err2)
    }
    if err := p.JoinGroup(ifi, gAddr); err != nil {
        log.Fatal(err)
    }
    if err := p.SetControlMessage(ipv4.FlagDst|ipv4.FlagSrc, true); err != nil {
        log.Fatal(err)
    }
    go func() {
        b := make([]byte, 1500)
        for {
            n, cm, src, err := p.ReadFrom(b)
            if err != nil {
                break
            }
            log.Println("receive:", string(b[:n]), cm.Dst.IsMulticast(), cm.Dst)
            if n2, err := p.WriteTo([]byte("world!"), nil, src); err != nil {
                log.Printf("fail to write back:%v\n", err)
            } else {
                log.Printf("write back addr: %s length:%d\n", src, n2)
            }
        }
    }()
    //client
    if conn, err2 := net.DialUDP("udp4", nil /*src*/, gAddr); err2 != nil {
        log.Fatal(err)
    } else {
        go func() {
            for {
                log.Println("write hello...")
                conn.Write([]byte("hello"))

                time.Sleep(time.Second * 2)
            }
        }()
        go func() {
            b2 := make([]byte, 1500)
            for {
                n, err := conn.Read(b2)
                if err != nil {
                    log.Panic(err)
                }
                log.Printf("sender received response:%s\n", string(b2[:n]))
            }
        }()

    }

}

func main() {
    If := os.Args[1]   //ens33
    Addr := os.Args[2] //224.0.0.248:1025
    SetupMulticast(If, Addr)
    for {
    }
}

And the output:

2022/08/17 22:53:53 listen ad:224.0.0.248:1025
2022/08/17 22:53:53 write hello...
2022/08/17 22:53:53 receive: hello true 224.0.0.248
2022/08/17 22:53:53 write back addr: 192.168.19.131:43925 length:6
2022/08/17 22:53:55 write hello...
2022/08/17 22:53:55 receive: hello true 224.0.0.248
2022/08/17 22:53:55 write back addr: 192.168.19.131:43925 length:6

From the logs, there are no any "sender received response" record. I don't know why?

0 Answers
Related