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" "log"
"net" "net"
"sync" "sync"
"time"
"gopkg.in/irc.v3" "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 { type Logger interface {
Print(v ...interface{}) Print(v ...interface{})
Printf(format string, 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) return fmt.Errorf("failed to accept connection: %v", err)
} }
setKeepAlive(netConn)
dc := newDownstreamConn(s, netConn) dc := newDownstreamConn(s, netConn)
go func() { go func() {
s.lock.Lock() 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) return nil, fmt.Errorf("failed to dial %q: %v", upstream.Addr, err)
} }
setKeepAlive(netConn)
msgs := make(chan *irc.Message, 64) msgs := make(chan *irc.Message, 64)
uc := &upstreamConn{ uc := &upstreamConn{
upstream: upstream, upstream: upstream,