First commit

This commit is contained in:
Henrik, Sölver
2022-08-05 19:52:12 +02:00
commit a402c29550
3 changed files with 73 additions and 0 deletions

8
README.md Normal file
View File

@@ -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.

3
go.mod Normal file
View File

@@ -0,0 +1,3 @@
module receievr
go 1.18

62
main.go Normal file
View File

@@ -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])
}
}