/* Copyright (C) 2014 by Alexandru Cojocaru */ /* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package main import ( "log" "net" ) var sem = make(chan int, 100) func echo(con net.PacketConn) { defer func() { <-sem }() buf := make([]byte, 4096) nr, addr, err := con.ReadFrom(buf) if err != nil { log.Print(err) return } nw, err := con.WriteTo(buf[:nr], addr) if err != nil { log.Print(err) return } if nw != nr { log.Printf("received %d bytes but sent %d\n", nr, nw) } } func main() { log.SetFlags(log.Lshortfile) con, err := net.ListenPacket("udp", ":7") if err != nil { log.Fatal(err) } for { sem <- 1 go echo(con) } err = con.Close() if err != nil { log.Fatal(err) } }