initial commit
This commit is contained in:
commit
19bcef65fa
4 changed files with 172 additions and 0 deletions
53
graceful.go
Normal file
53
graceful.go
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
// 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()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue