1 回答

TA貢獻1818條經(jīng)驗 獲得超7個贊
有(至少)兩種方法可以做到:
使用net.ListenConfig:
該net.ListenConfig對象有一個KeepAlive time.Duration字段。當非零時,這將用于在接受的連接上設置保持活動狀態(tài)(例如:對于 posix 上的 TCP)。
您可以將偵聽器傳遞給ServeTLS:
server := &http.Server{...}
lc := net.ListenConfig{KeepAlive: 1000 * time.Second}
ln, err := lc.Listen(context.Background(), "tcp", ":8080")
if err != nil {
panic(err)
}
defer ln.Close()
log.Fatal(server.ServeTLS(ln, "../example.crt", "../example.key"))
如前所述,接受的 TCP 連接將自動啟用 keep-alive 并將周期設置為指定值。
使用tls.Config回調(diào):
您可以通過設置tls.Config或回調(diào)來訪問net.Conn底層。tls.Conn GetConfigForClientGetCertificate
只要您返回nil以使 TLS 代碼回退到默認行為,您使用哪一個都沒有關系。重要的部分是訪問tls.ClientHelloInfo,它有一個.Conn指向底層連接的字段。這將net.TCPConn.
setTCPKeepAlive := func(clientHello *tls.ClientHelloInfo) (*tls.Config, error) {
// Check that the underlying connection really is TCP.
if tcpConn, ok := clientHello.Conn.(*net.TCPConn); ok {
if err := tcpConn.SetKeepAlivePeriod(1000 * time.Second); err != nil {
fmt.Println("Could not set keep alive period", err)
} else {
fmt.Println("update keep alive period")
}
} else {
fmt.Println("TLS over non-TCP connection")
}
// Make sure to return nil, nil to let the caller fall back on the default behavior.
return nil, nil
}
tlsConfig := &tls.Config{
...
GetConfigForClient: setTCPKeepAlive,
...
}
server := &http.Server{
Addr: ":8080",
TLSConfig: tlsConfig,
}
server.ListenAndServeTLS("../example.crt", "../example.key")
- 1 回答
- 0 關注
- 156 瀏覽
添加回答
舉報