53 lines
1 KiB
Go
53 lines
1 KiB
Go
// 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()
|
|
}
|