First commit
This commit is contained in:
8
README.md
Normal file
8
README.md
Normal 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.
|
||||
62
main.go
Normal file
62
main.go
Normal 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])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user