}
func serveTCP(listener *net.TCPListener) {
+ defer listener.Close()
+ logger.Print("listening on TCP ", listener.Addr())
for {
conn, err := listener.AcceptTCP()
if shutting_down {
return
}
- checkFatal(err, "Accept")
- logger.Print("connect from ", conn.RemoteAddr())
- go handleRequest(conn)
+ if checkFatal(err, "Accept") == nil {
+ logger.Print("connect from ", conn.RemoteAddr())
+ go handleRequest(conn)
+ }
}
}
checkFatal(err, "ResolveTCPAddr")
listener, err := net.ListenTCP("tcp", address)
checkFatal(err, "ListenTCP")
- logger.Print("listening on TCP ", address)
go serveTCP(listener)
// wait for signal
sigchan := make(chan os.Signal)
signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
sig := <-sigchan
- tracer.Print("Received signal: ", sig)
+ logger.Print("shutdown on signal: ", sig)
shutting_down = true
tracer.Print("Bye.")
}
import (
"io/ioutil"
"log"
+ "net"
"os"
"path/filepath"
"runtime"
}
}
-func checkFatal(err error, msg string) {
+func checkFatal(err error, msg string) error {
if err != nil {
_, file, line, _ := runtime.Caller(1)
- loggex.Fatalf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err)
+ if ne, ok := err.(net.Error); ok && ne.Temporary() {
+ // this a temporary error so we should sleep and retry
+ loggex.Printf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err)
+ } else {
+ loggex.Fatalf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err)
+ }
}
+ return err
}
func check(err error, msg string) error {