gpt4 book ai didi

go - 如何调用 TCPConn.SetLinger()?

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

我正在使用 Go 1.2 并尝试在我的服务器由于输入中的 fatal error 而关闭的套接字上调用 TCPConn.SetLinger(0)。但是,我不知道该怎么做。 net.Listener.Accept() 和 TCPListener.Accept() 都返回 net.Conn,而不是 net.TCPConn。 net.Conn 没有实现 SetLinger。我尝试进行类型切换,但随后编译器提示“不可能的类型切换情况:conn(类型 net.Conn)不能具有动态类型 net.TCPConn(缺少 Close 方法)”。 net.TCPConn 怎么会缺少 Close 方法?我没有检查来源,但文档列出了一个关闭方法(以及你不能关闭什么样的连接,不管怎样?)。

似乎您无法将 net.Conn 转换为 net.TCPConn(因为没有 Close 方法),并且您无法在服务器上获得 TCPConn,因为所有 Accept() 都返回一个 net.Conn。那么我实际上如何调用 SetLinger 呢? (或者就此而言,SetKeepAlive、SetNoDelay?)

仔细观察后,似乎有一个返回 TCPListener 的 net.TCPListener.AcceptTCP(),这真的是我必须要做的吗?为什么我不能从 Accept() 获得 TCPConn?我从 net.Listen("tcp", ":4321") 开始,所以我知道它必须是下面的 TCPConn...

最佳答案

你可以使用 TCPListener.AcceptTCP() , Accept只需调用 AcceptTCP 并返回 *TCPConn 作为接口(interface)。

来自 http://golang.org/src/pkg/net/tcpsock_posix.go?s=7727:7771#L233

func (l *TCPListener) Accept() (Conn, error) {
c, err := l.AcceptTCP() //notice this part
if err != nil {
return nil, err
}
return c, nil
}

或者像 James 在评论中提到的那样,您可以简单地将其转换为 tcpcon := conn.(*net.TCPConn)

关于go - 如何调用 TCPConn.SetLinger()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24878823/

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