package main import ( "encoding/hex" "fmt" "golang.org/x/net/ipv4" "log" "net" ) func Listen(address string, handler func(*net.UDPAddr, int, []byte)) { laddr := net.UDPAddr{ IP: net.IPv4(10, 10, 100, 244), Port: 3002, } raddr := net.UDPAddr{IP: net.IPv4(239, 22, 22, 183), Port: 3003} lconn, err := net.DialUDP("udp4", &laddr, &raddr) if err != nil { log.Fatal(err) } addr, err := net.ResolveUDPAddr("udp4", address) if err != nil { log.Fatal(err) } conn, err := net.ListenMulticastUDP("udp4", nil, addr) if err != nil { log.Fatal(err) } pc := ipv4.NewPacketConn(conn) iface, err := net.InterfaceByName("eno2") if err != nil { log.Fatal(err) } if err := pc.JoinGroup(iface, &net.UDPAddr{IP: net.IPv4(239, 0, 2, 183)}); err != nil { log.Fatal(err) } if loop, err := pc.MulticastLoopback(); err != nil { fmt.Printf("mulicastLoogback status : %v\n", loop) if !loop { if err := pc.SetMulticastLoopback(true); err != nil { fmt.Printf("setmuticastlooknacl error:%v\n", err) } } } conn.SetReadBuffer(2048) for { buffer := make([]byte, 2048) numBytes, src, err := conn.ReadFromUDP(buffer) lconn.Write(buffer[:numBytes]) if err != nil { log.Fatal("ReadFromUDP failed:", err) } handler(src, numBytes, buffer) } } func msgHandler(src *net.UDPAddr, n int, b []byte) { fmt.Printf("%v\n", hex.Dump(b[:n])) } func main() { Listen("239.0.2.183:5000", msgHandler) }