Skip to content

Instantly share code, notes, and snippets.

@davecheney
Created January 25, 2011 04:42
Show Gist options
  • Save davecheney/794521 to your computer and use it in GitHub Desktop.
Save davecheney/794521 to your computer and use it in GitHub Desktop.
// Add multicast support to UDPConn
package net
import (
"os"
"syscall"
"fmt"
)
// Join a multicast group. Only IPv4 addresses are supported
func (c *UDPConn) JoinGroup(addr IP) os.Error {
ip := addr.To4()
if ip == nil {
return fmt.Errorf("%s is not an IPv4 multicast address", addr)
}
return os.NewSyscallError("setsockopt", syscall.SetsockoptString(c.fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, makeMReqString(ip)))
}
// Leave a multicast group. Only IPv4 addresses are supported
func (c *UDPConn) LeaveGroup(addr IP) os.Error {
ip := addr.To4()
if ip == nil {
return fmt.Errorf("%s is not an IPv4 multicast address", addr)
}
return os.NewSyscallError("setsockopt", syscall.SetsockoptString(c.fd.sysfd, syscall.IPPROTO_IP, syscall.IP_DROP_MEMBERSHIP, makeMReqString(ip)))
}
// construct a string to pass to syscall.SetsocketoptString
// that conforms to the ip_mreq struct. addr must be an IPv4
// style address
func makeMReqString(addr IP) string {
return string(append([]byte(addr), 0, 0, 0, 0))
}
package main
import (
"net"
"log"
godns "github.com/miekg/godns"
)
func main() {
addr, err := net.ResolveUDPAddr("0.0.0.0:5353")
if err != nil {
log.Exit(err)
}
socket, err := net.ListenUDP("udp", addr)
if err != nil {
log.Exitf("listen %s", err)
}
defer socket.Close()
err = socket.JoinGroup(net.IPv4(224, 0, 0, 251))
if err != nil {
log.Exitf("join group %s", err)
}
for {
buff := make([]byte, 4096)
read, err := socket.Read(buff)
if err != nil {
log.Exitf("read %s", err)
}
msg := &godns.Msg{}
msg.Unpack(buff[:read])
log.Println(msg.String())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment