tcp - 为什么 tcp-keep-alive 会影响 go 中的 tcp-close?

标签 tcp go

我有一个服务器,在接受连接时,我将 tcp-keep-alive 设置为 120 秒。但是当我关闭连接时,实际上连接并没有关闭。by netstat -anp | grep 9999,我发现状态是 ESTABLISHED 。客户端也没有从 socket 收到任何错误。我想知道 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()
}

最佳答案

不要使用那个 keepalive 库。它复制文件描述符,但无法关闭它们。

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

您可能不需要设置任何额外的选项,但只有当您确定需要时,您才可以尝试通过适当的系统调用来应用所需的内容。

关于tcp - 为什么 tcp-keep-alive 会影响 go 中的 tcp-close?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28363575/

相关文章:

c# - 如何连接用不同语言编写的客户端服务器

HTTP 可下载文件服务

security - Go Web 应用程序中的 CSRF

mongodb - 如何在使用 go 的 mongodb 查询中使用 $or 和 $lookup?

java - 使用 SAAJ 从 TCP 套接字流读取 SOAP 消息

c# - 确定 .NET 套接字当前是否连接错误?

python - Scapy:处理部分 TLS 段

c - 从 TCP/IP 流量构建文件?

multithreading - 与 goroutine 并行运行代码的首选语法是什么?

unix - syscall.Stat_t.Dev 映射到什么?