63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
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])
|
|
}
|
|
}
|