为什么tcp-keep-alive会影响tcp-close呢?

时间:2015-02-06 10:25:09

标签: tcp go

我有一台服务器,在接受连接时,我将tcp-keep-alive设置为120秒。但是当我关闭连接时,实际上连接没有关闭。netstat -anp | grep 9999,我发现状态是ESTABLISHED。客户端也没有从套接字收到任何错误。我想知道tcp-keep-alive会影响tcp-close吗?

PS去1.4美分

package main
import (
    "github.com/felixge/tcpkeepalive"
    "net"
    "runtime"
    "time"
)
func  Start() {
    tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:9999")
    if err != nil {
        return
    }
    listener, err := net.ListenTCP("tcp", tcpAddr)
    if err != nil {
        return
    }
    for {
        conn, err := listener.AcceptTCP()
        if err != nil {
            continue
        }
        go handleClient(conn)
    }
}

func handleClient(conn *net.TCPConn) {
    kaConn, err := tcpkeepalive.EnableKeepAlive(conn)
    if err != nil {
    } else {
        kaConn.SetKeepAliveIdle(120 * time.Second)
        kaConn.SetKeepAliveCount(4)
        kaConn.SetKeepAliveInterval(5 * time.Second)
    }
    time.Sleep(time.Second * 3)
    conn.Close()
    return
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    Start()
}

1 个答案:

答案 0 :(得分:4)

不要使用keepalive库。它复制了文件描述符,无法关闭它们。

如果需要设置KeepAlive,请使用网络包中提供的方法。

您可能不需要设置任何额外的选项,但只有在您确定自己这样做的情况下,您才可以尝试使用相应的系统调用来应用所需的选项。