gpt4 book ai didi

python - 如何知道远程tcp设备是否关机

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

在我的 GO 代码中,我正在建立一个 TCP 连接,如下所示:

conn, err1 := net.Dial("tcp", <remote_address>)
if err1 == nil {
buf := make([]byte, 256)
text, err := conn.Read(buf[:])
if err == io.EOF {
//remote connection close handle
fmt.Println("connection got reset by peer")
panic(err)
}
}

为了模拟另一端,我在另一台计算机上运行一个 python 脚本,它打开一个套接字并将一些随机数据发送到上面的代码行正在监听的套接字。现在我的问题是,当我通过按 ctrl+C 杀死这个 python 代码时,远程连接关闭事件被上面的代码很好地识别,我有机会处理它。

但是,如果我只是关闭远程计算机(运行 python 脚本的地方),我的代码根本不会收到通知。

在我的例子中,连接应该始终打开并且应该能够随机发送数据,并且只有当远程机器断电时,我的 GO 代码才会收到通知。

有人可以在这种情况下帮助我吗,当托管套接字的远程机器本身断电时,我将如何收到通知?我如何在我的 GO 代码中远程获取触发器?

PS - 这似乎是实时中非常普遍的问题,尽管在测试环境中并非如此。

最佳答案

无法确定断电的主机和断开的连接之间的区别,因此您以相同的方式对待它们。

你可以自己发送一个心跳消息,当心跳包之间达到某个超时时间时关闭连接。可以通过对数据包计时来手动设置超时,也可以使用 SetReadDeadline。在每次读取之前,在达到截止日期时立即终止连接。

您也可以使用 TCP Keepalive 为您完成此操作,使用 TCPConn.SetKeepAlive启用它和TCPConn.SetKeepAlivePeriod设置keepalive数据包之间的间隔。实际关闭连接所需的时间取决于系统。

您还应该在拨号时设置超时,因为不能保证连接到故障主机会返回 ICMP 主机无法访问响应。您可以使用 DialTimeout , 一个 net.Dialer使用 Timeout 参数集,或 Dialer.DialContext .

只需阅读 stdlib 文档即可为您提供大量信息:https://golang.org/pkg/net/

关于python - 如何知道远程tcp设备是否关机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508074/

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