From a402c2955017cd2c9432a9abaa086dac521adb00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=2C=20S=C3=B6lver?= Date: Fri, 5 Aug 2022 19:52:12 +0200 Subject: [PATCH] First commit --- README.md | 8 +++++++ go.mod | 3 +++ main.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 README.md create mode 100644 go.mod create mode 100644 main.go diff --git a/README.md b/README.md new file mode 100644 index 0000000..3cd8f69 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# UDP receiver +Just a small example how server receiving UDP packets can be implemented in Go. + +To send to it `nc` can be used + +`echo -n "some string" | nc -4 -u -w 0 localhost 30000` + +Sending `stop` will make the program exit. \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..98fc352 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module receievr + +go 1.18 diff --git a/main.go b/main.go new file mode 100644 index 0000000..1d46e58 --- /dev/null +++ b/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "errors" + "fmt" + "net" + "sync" + "time" +) + +func main() { + var wg sync.WaitGroup + conn, err := net.ListenUDP("udp4", &net.UDPAddr{Port: 30000}) + if err != nil { + panic(err) + } + fmt.Printf("Listening on %v\n", conn.LocalAddr().String()) + wg.Add(1) + inchan := make(chan string) + t := time.NewTimer(time.Minute) + go readProc(&wg, conn, inchan) +loop: + for { + select { + case s := <-inchan: + fmt.Printf("got %s\n", s) + if s == "stop" { + fmt.Println("stop stop", s) + conn.Close() + break loop + } + case timeStamp := <-t.C: + conn.Close() + fmt.Printf("Time Stop %v\n", timeStamp) + break loop + } + } + fmt.Println("Exiting") + wg.Wait() + +} + +func readProc(wg *sync.WaitGroup, conn *net.UDPConn, inchan chan string) { + defer wg.Done() + var n int + var addr *net.UDPAddr + var err error + for { + buf := make([]byte, 1000) + n, addr, err = conn.ReadFromUDP(buf) + if err != nil { + if errors.Is(err, net.ErrClosed) { + fmt.Println("Socket closed") + } else { + fmt.Printf("Got some other error: %v\n", err.Error()) + } + return + } + fmt.Printf("Received %v bytes from %v\n", n, addr.String()) + inchan <- string(buf[:n]) + } +}