2015-02-06 58 views
2

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

PS去1.4 CentOS的

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() 
} 
+2

通常它不会,我没有足够的时间发布一个完整的答案 - 但是你使用的tcpkeepalive库是错误的,似乎是复制和泄漏文件描述符。 – nos 2015-02-06 10:46:36

回答

2

不要使用保活库。它复制文件描述符,并且无法关闭它们。

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

你可能不需要任何额外的选项设置,但只有当你肯定你这样做,那么你可以尝试申请什么需要用适当的系统调用。

相关问题