gpt4 book ai didi

sockets - 检测 tcp 断开连接的正确方法?手动 keepalive idle ,不工作 SetWriteDeadLine

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:36 25 4
gpt4 key购买 nike

我的 TCP 连接有问题。

我有一个用 go 编写的服务器,它在某个端口上监听 tcp 连接。我有用 Java 为 Android 编写的客户端。客户端与服务器建立连接,然后在没有任何规律的情况下交换一些数据。

当 Android 更改网络类型时,例如从移动网络更改为 wifi。连接中断,但服务器不知道这个问题,并认为客户端已准备好接收一些数据。

我需要尽快在我的服务器上检测到这个问题。理想情况下立即

首先我在 go SetKeepAlive(true)SetKeepAlivePeriod(10 * time.Second) 中使用。它奏效了,但没有我需要的那么快。因为去SetKeepAlivePeriod,设置tcp keepalive time(idle)tcp keepalive interval相同。例如在 linux tcp keepalive retry=8 中,然后在 (10 + 8*10) = 90sec = 1 min 30sec 后检测到连接问题。它非常非常慢 :(。如何手动设置空闲和间隔时间?我在看这个库 https://github.com/felixge/tcpkeepalive,但我不信任这个库,因为在这个库中套接字 fd 复制时没有清除。

我可以设置 SetKeepAlivePeriod(1 * time.Second),但是性能怎么样?在我的例子中,连接可能负载很重或空闲。

然后,我想到了 SetWriteDeadline。这对我来说非常有用,因为我不知道我什么时候从客户端收到消息,但我知道我什么时候向客户端发送消息。但是当我使用 SetWriteDeadline 时,它​​不起作用。例如

var request *http.Request

conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
err := request.Write(conn)
if err != nil {
if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
log.Println("Connection WriteDeadline timeout")
}
conn.Close();
} else {
conn.SetWriteDeadline(time.Time{})
}

当客户端连接断开后,我将一些数据写入连接,方法 Write 返回 nil 没有错误。好像数据已经发送并且服务器成功接受了来自客户端的 ACK,但是如何?

更新时间 28.10.2015 22:35

我决定试试这个 https://github.com/felixge/tcpkeepalive图书馆。但它非常适合我的问题:)。

ka, _ := tcpkeepalive.EnableKeepAlive(conn)
ka.SetKeepAliveCount(2)
ka.SetKeepAliveInterval(3 * time.Second)
ka.SetKeepAliveIdle(10 * time.Second)

最佳答案

为简单起见,请不要使用 TCP 级别的东西来确保您的业务 session 的东西。您真正需要的是检测中断的 session ,因此请继续在业务级别发送乒乓球。您可以简单地计算负载,例如带有 tcp header 的“ping”字符串,应以 30 字节为单位。

关于sockets - 检测 tcp 断开连接的正确方法?手动 keepalive idle ,不工作 SetWriteDeadLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com