Last active
December 21, 2015 15:29
-
-
Save umitanuki/6326995 to your computer and use it in GitHub Desktop.
Multicast replies in unicast
This file contains 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 "log" | |
import "net" | |
import "os" | |
var gaddr *net.UDPAddr = &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254), Port: 12345} | |
func listener(c chan int) { | |
logger := log.New(os.Stdout, "[L]", log.Ltime | log.Lshortfile) | |
conn, err := net.ListenMulticastUDP("udp", nil, gaddr) | |
if err != nil { | |
logger.Fatalf("failed to listen: %s\n", err) | |
return | |
} | |
c <- 1 | |
defer conn.Close() | |
logger.Printf("laddr = %s", conn.LocalAddr().String()) | |
buf := make([]byte, 512) | |
_, dest, err := conn.ReadFromUDP(buf) | |
if err != nil { | |
logger.Fatalf("failed to read: %s\n", err) | |
return | |
} | |
logger.Printf("read from %s: %s\n", dest.String(), string(buf)) | |
msg := "world" | |
_, err = conn.WriteToUDP([]byte(msg), dest) | |
if err != nil { | |
logger.Fatalf("failed to write: %s\n", err) | |
} | |
logger.Printf("end of listener\n") | |
c <- 1 | |
} | |
func sender(c chan int) { | |
logger := log.New(os.Stdout, "[S]", log.Ltime | log.Lshortfile) | |
<-c | |
laddr := &net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 3333} | |
conn, err := net.DialUDP("udp", laddr, gaddr) | |
if err != nil { | |
logger.Fatalf("failed to dial: %s\n", err) | |
return | |
} | |
defer conn.Close() | |
logger.Printf("laddr = %s", conn.LocalAddr().String()) | |
msg := "hello" | |
n, err := conn.Write([]byte(msg)) | |
if err != nil { | |
logger.Fatalf("client failed to write: %s\n", err) | |
return | |
} | |
logger.Printf("%d bytes written\n", n) | |
buf := make([]byte, 512) | |
_, remote, err := conn.ReadFrom(buf) | |
if err != nil { | |
logger.Fatalf("client failed to read: %s\n", err) | |
return | |
} | |
logger.Printf("client read from %s: %s\n", remote, string(buf)) | |
<-c | |
} | |
func main() { | |
c := make(chan int, 1) | |
go listener(c) | |
sender(c) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment