gpt4 book ai didi

ssl - 无法在 golang 上将 *tls.listener 转换为 *net.TCPListener

转载 作者:IT王子 更新时间:2023-10-29 01:59:16 26 4
gpt4 key购买 nike

我在 GO 上创建了一个 TLS 服务器。

func main() {
Log("Hello server!")

cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
if err != nil {
Log("server: loadkeys: ", err);
return;
}

config := tls.Config{Certificates: []tls.Certificate{cert}}
config.Rand = rand.Reader
service := "0.0.0.0:9988"
listener, err := tls.Listen("tcp", service, &config)
if err != nil {
Log("server: listen: %s", err)
return
}

defer listener.Close()

for {
Log("Waiting for clients")

connection, error := listener.Accept()
if error != nil {
Log("Client error: ", error)
} else {
//connection.SetLinger(0) //error here
go ClientHandler(connection)
}
}
}

我无法调用 SetLinger 函数,因为 tls.Listen 函数返回 net.Listener。我需要 net.TCPListener。

我试过:

tpcListener := listener.(*net.TCPListener)

错误: panic :接口(interface)转换:net.Listener 是*tls.listener,不是*net.TCPListener

net包上有ListenTCP,tls包上没有ListenTCP。

最佳答案

您明确提到了 SetLinger,但它是在 TCPConn 上调用的,不是TCPListener 上调用的。您是否检查过接受的 net.Conn 是否可以断言为 *net.TCPConn


crypto/tls 包通过非导出类型实现了 net.Listener 接口(interface),因此您无法通过这种方式访问​​“内部”监听器。

如果你真的需要一个net.TCPListener:与所有其他提供为您创建监听器的便利函数的 Go 标准包一样,还有一些较低级别的函数可以让您创建自己的函数。所以调用 net.ListenTCP,然后调用任何你喜欢的方法,然后通过 tls.NewListener 将它传递给 tls 包。 .查看source for crypto/tls's Listen以获得进一步的指导。

关于ssl - 无法在 golang 上将 *tls.listener 转换为 *net.TCPListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066946/

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