我在golang的tcp服务器上工作,最近我发现了一个问题,当客户端连接到服务器时,使用netstat -nat|grep -i "55555"
进行检查,它告诉我连接已建立且Recv-Q有消息,但是Accept()
需要几秒钟才能返回。我很困惑,有人能告诉我为什么或提出任何建议如何找到问题?
这是我的主要代码
tcpAddr, err := net.ResolveTCPAddr("tcp4", server.Host)
if err != nil {
log.Error(err.Error())
os.Exit(-1)
}
listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
log.Error(err.Error())
os.Exit(-1)
}
for {
conn, err := listener.Accept()
if err != nil {
continue
}
log.Debug("Accept a new connection")
go handleClient(conn)//deal the connection
}
P.S。
在handleClient
中,它太长了,我无法将其粘贴到此处,只有一件事,我将tcp keep alive
设置为连接,请使用此包github.com/felixge/tcpkeepalive
kaConn, err := tcpkeepalive.EnableKeepAlive(connection)
if err != nil {
log.Debug("EnableKeepAlive err ", err)
}else{
kaConn.SetKeepAliveIdle(30*time.Second)
kaConn.SetKeepAliveCount(4)
kaConn.SetKeepAliveInterval(5*time.Second)
}
更新:
当我停止tcp keep alive
时,它会正常工作,Accept
会立即返回。
但即使不停止tcp保持活动,Accept
在我使用脚本进行测试时立即返回。它是否与客户端有关?