Accept()在golang中返回需要太长时间

时间:2014-09-18 03:12:37

标签: networking go

我在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在我使用脚本进行测试时立即返回。它是否与客户端有关?

0 个答案:

没有答案