Skip to content

Instantly share code, notes, and snippets.

@refs
Forked from fiorix/gist:9664255
Created December 23, 2019 13:55
Show Gist options
  • Select an option

  • Save refs/77aace5f89c0ad7e17aff0858c0b3aa7 to your computer and use it in GitHub Desktop.

Select an option

Save refs/77aace5f89c0ad7e17aff0858c0b3aa7 to your computer and use it in GitHub Desktop.

Revisions

  1. @fiorix fiorix created this gist Mar 20, 2014.
    52 changes: 52 additions & 0 deletions gistfile1.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    package main

    import (
    "encoding/hex"
    "log"
    "net"
    "time"
    )

    const (
    srvAddr = "224.0.0.1:9999"
    maxDatagramSize = 8192
    )

    func main() {
    go ping(srvAddr)
    serveMulticastUDP(srvAddr, msgHandler)
    }

    func ping(a string) {
    addr, err := net.ResolveUDPAddr("udp", a)
    if err != nil {
    log.Fatal(err)
    }
    c, err := net.DialUDP("udp", nil, addr)
    for {
    c.Write([]byte("hello, world\n"))
    time.Sleep(1 * time.Second)
    }
    }

    func msgHandler(src *net.UDPAddr, n int, b []byte) {
    log.Println(n, "bytes read from", src)
    log.Println(hex.Dump(b[:n]))
    }

    func serveMulticastUDP(a string, h func(*net.UDPAddr, int, []byte)) {
    addr, err := net.ResolveUDPAddr("udp", a)
    if err != nil {
    log.Fatal(err)
    }
    l, err := net.ListenMulticastUDP("udp", nil, addr)
    l.SetReadBuffer(maxDatagramSize)
    for {
    b := make([]byte, maxDatagramSize)
    n, src, err := l.ReadFromUDP(b)
    if err != nil {
    log.Fatal("ReadFromUDP failed:", err)
    }
    h(src, n, b)
    }
    }