我如何调用TCPConn.SetLinger()?

时间:2014-07-22 04:16:20

标签: go

我正在使用Go 1.2并尝试在我的服务器因输入中的致命错误而关闭的套接字上调用TCPConn.SetLinger(0)。但是,我无法弄清楚我将如何做到这一点。 net.Listener.Accept()和TCPListener.Accept()都返回net.Conn,而不是net.TCPConn。 net.Conn没有实现SetLinger。我尝试做一个类型切换,但后来编译器抱怨“不可能的类型切换案例:conn(类型net.Conn)不能有动态类型net.TCPConn(缺少关闭方法)”。 net.TCPConn怎么会缺少Close方法?我没有检查过源代码,但是文档列出了一个close方法(无论如何,你不能关闭什么样的连接?)。

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

仔细观察后,看起来有一个net.TCPListener.AcceptTCP()返回一个TCPListener,这真的是我要做的吗?为什么我不能从Accept()获得TCPConn?我用net.Listen(“tcp”,“:4321”)启动它,所以我知道它必须是下面的TCPConn ......

1 个答案:

答案 0 :(得分:1)

您可以使用TCPListener.AcceptTCP()Accept只需调用AcceptTCP并返回*TCPConn作为界面。

来自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
}

或者像詹姆斯在评论中提到的那样,你可以简单地将其投射到tcpcon := conn.(*net.TCPConn)