Enable TCP keep-alive on all connections

git-svn-id: file:///srv/svn/repo/suika/trunk@67 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This commit is contained in:
contact 2020-02-18 16:26:17 +00:00
parent e6fad26ac1
commit 9edf0cde7e
2 changed files with 19 additions and 0 deletions

View File

@ -5,10 +5,25 @@ import (
"log"
"net"
"sync"
"time"
"gopkg.in/irc.v3"
)
// TODO: make configurable
var keepAlivePeriod = time.Minute
func setKeepAlive(c net.Conn) error {
tcpConn, ok := c.(*net.TCPConn)
if !ok {
return fmt.Errorf("cannot enable keep-alive on a non-TCP connection")
}
if err := tcpConn.SetKeepAlive(true); err != nil {
return err
}
return tcpConn.SetKeepAlivePeriod(keepAlivePeriod)
}
type Logger interface {
Print(v ...interface{})
Printf(format string, v ...interface{})
@ -177,6 +192,8 @@ func (s *Server) Serve(ln net.Listener) error {
return fmt.Errorf("failed to accept connection: %v", err)
}
setKeepAlive(netConn)
dc := newDownstreamConn(s, netConn)
go func() {
s.lock.Lock()

View File

@ -56,6 +56,8 @@ func connectToUpstream(u *user, upstream *Upstream) (*upstreamConn, error) {
return nil, fmt.Errorf("failed to dial %q: %v", upstream.Addr, err)
}
setKeepAlive(netConn)
msgs := make(chan *irc.Message, 64)
uc := &upstreamConn{
upstream: upstream,