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