Search code examples
goudpbroadcastmulticast

Golang UDP multicast not working in windows10


I developed an example that uses udp multicast to send and receive data,it work at linux but not wort at window10. I try to developed another udp multicast application by Java, it works in the same environment! Where is the problem?

Golang code:

package main

import (
    "flag"
    "fmt"
    "net"
    "strings"
)

var (
    bind = flag.String("bind", "239.255.0.0", "bind")
    port = flag.Int("port", 2222, "port")
    cmd  = flag.String("cmd", "server", "Command")
)

func main() {
    flag.Parse()
    addr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%d", *bind, *port))

    if err != nil {
        panic(err)
    }
    switch *cmd {
    case "server":
        {
            startServer(addr)
        }
    case "client":
        {
            startClient(addr, strings.Join(flag.Args(), ""))
        }
    }

}

func startServer(addr *net.UDPAddr) {
    conn, err := net.ListenMulticastUDP("udp4", nil, addr)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("Server was started")
    }
    var buff = make([]byte, 1600)
    for {
        l, remoteAddr, err := conn.ReadFromUDP(buff)
        if err != nil {
            panic(err)
        }
        fmt.Printf("read data from %v, data: %s\n", remoteAddr, string(buff[0:l]))
    }
}

func startClient(addr *net.UDPAddr, msg string) {
    conn, err := net.DialUDP("udp4", nil, addr)
    if err != nil {
        panic(err)
    }

    l, err := conn.Write([]byte(msg))
    if err != nil {
        panic(err)
    } else {
        fmt.Printf("Wrote byte length %d\n", l)
    }
    conn.Close()
}


Solution

  • Eureka! The problem was caused by "The Winsock version of the IP_MULTICAST_LOOP option is semantically different than the UNIX version of the IP_MULTICAST_LOOP option":

    In Winsock, the IP_MULTICAST_LOOP option applies only to the receive path.
    In the UNIX version, the IP_MULTICAST_LOOP option applies to the send path.
    

    https://learn.microsoft.com/en-us/windows/win32/winsock/ip-multicast-2

    How to set IP_MULTICAST_LOOP on multicast UDPConn in Golang