// NewKeepAliveListener returns a listener that listens on the given address. // Be careful when wrap around KeepAliveListener with another Listener if TLSInfo is not nil. // Some pkgs (like go/http) might expect Listener to return TLSConn type to start TLS handshake. // http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html // // Note(ahrtr): // only `net.TCPConn` supports `SetKeepAlive` and `SetKeepAlivePeriod` // by default, so if you want to wrap multiple layers of net.Listener, // the `keepaliveListener` should be the one which is closest to the // original `net.Listener` implementation, namely `TCPListener`. func NewKeepAliveListener(l net.Listener, scheme string, tlscfg *tls.Config) (net.Listener, error) { … } type keepaliveListener … func (kln *keepaliveListener) Accept() (net.Conn, error) { … } func createKeepaliveConn(c net.Conn) (*keepAliveConn, error) { … } type keepAliveConn … // SetKeepAlive sets keepalive func (l *keepAliveConn) SetKeepAlive(doKeepAlive bool) error { … } type tlsKeepaliveListener … // Accept waits for and returns the next incoming TLS connection. // The returned connection c is a *tls.Conn. func (l *tlsKeepaliveListener) Accept() (c net.Conn, err error) { … } // NewListener creates a Listener which accepts connections from an inner // Listener and wraps each connection with Server. // The configuration config must be non-nil and must have // at least one certificate. func newTLSKeepaliveListener(inner net.Listener, config *tls.Config) net.Listener { … }