2015-02-06 49 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包中提供的方法。

你可能不需要任何額外的選項設置,但只有當你肯定你這樣做,那麼你可以嘗試申請什麼需要用適當的系統調用。

相關問題