// Package graceful provides a graceful tcp handling library package graceful import ( "errors" "net" "time" ) const network = "tcp" var ErrInterfaceConversion = errors.New("interface conversion failed") // Listener is a wrapper for net.TCPListener type Listener struct { *net.TCPListener keepAlive time.Duration } // New wraps Listener around net.TCPListener func New(laddr string, keepAlive time.Duration) (*Listener, error) { l, err := net.Listen(network, laddr) if err != nil { return nil, err } tcpl, ok := l.(*net.TCPListener) if !ok { return nil, ErrInterfaceConversion } return &Listener{ TCPListener: tcpl, keepAlive: keepAlive, }, nil } // Accept wraps net.TCPListener.AcceptTCP method func (l *Listener) Accept() (net.Conn, error) { conn, err := l.AcceptTCP() if err != nil { return conn, err } if l.keepAlive > 0 { conn.SetKeepAlive(true) conn.SetKeepAlivePeriod(l.keepAlive) } return conn, nil } // Stop stops the listener func (l *Listener) Stop() { l.TCPListener.Close() }