Created
January 25, 2011 04:42
-
-
Save davecheney/794521 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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)) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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