我有一台服务器,在接受连接时,我将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()
}
答案 0 :(得分:4)
不要使用keepalive库。它复制了文件描述符,无法关闭它们。
如果需要设置KeepAlive,请使用网络包中提供的方法。
您可能不需要设置任何额外的选项,但只有在您确定自己这样做的情况下,您才可以尝试使用相应的系统调用来应用所需的选项。