gpt4 book ai didi

go - 如何在 *tls.Conn 上设置 SetKeepAlivePeriod

转载 作者:行者123 更新时间:2023-12-01 20:21:57 25 4
gpt4 key购买 nike

我想增加 HTTP 和 HTTPS 请求的 TCP 连接的保持事件时间。
对于 HTTP 请求,可以这样完成:

package main

import (
"fmt"
"io"
"log"
"net"
"net/http"
"time"
)

func main() {
server := &http.Server{Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello, World!")
})}

server.ConnState = func(conn net.Conn, state http.ConnState) {
if state == http.StateNew {
if err := conn.(*net.TCPConn).SetKeepAlivePeriod(1000 * time.Second); err != nil {
fmt.Println("Could not set keep alive period", err)
} else {
fmt.Println("update keep alive period")
}
}
}

log.Fatal(server.ListenAndServe())
}
对于 HTTPS 请求,这不能通过 server.ConnState 完成,因为将在函数内部传递的 net.Conn*tls.Conn 。此连接不会公开像 SetKeepAlivePeriod 这样的函数,也不会提供对底层 *net.TCPConn 的访问权限。
func main() {
server := &http.Server{Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello, World!")
})}

server.ConnState = func(conn net.Conn, state http.ConnState) {
if state == http.StateNew {
tlsConn := conn.(*tls.Conn)
// how to set SetKeepAlivePeriod
}
}

log.Fatal(server.ListenAndServeTLS("../example.crt", "../example.key"))
}
如何设置 tls 连接的保活期?

最佳答案

有(至少)两种方法可以做到:
使用 net.ListenConfig :net.ListenConfig对象有 KeepAlive time.Duration field 。当非零时,这将用于在接受的连接上设置保持事件状态(例如:for TCP on posix)。
您可以将监听器传递给 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打回来:
您可以访问 net.Conn底层 tls.Conn通过设置 tls.Config 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")

关于go - 如何在 *tls.Conn 上设置 SetKeepAlivePeriod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63676241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com