Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何知道远程tcp设备是否已关闭电源_Python_Sockets_Go_Tcp - Fatal编程技术网

Python 如何知道远程tcp设备是否已关闭电源

Python 如何知道远程tcp设备是否已关闭电源,python,sockets,go,tcp,Python,Sockets,Go,Tcp,在我的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("conn

在我的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)
    }
}
conn,err1:=net.Dial(“tcp”)
如果err1==nil{
buf:=make([]字节,256)
text,err:=conn.Read(buf[:])
如果err==io.EOF{
//远程连接关闭句柄
fmt.Println(“对等方重置了连接”)
恐慌(错误)
}
}
为了模拟另一端,我在另一台计算机上运行python脚本,它打开一个套接字并将一些随机数据发送到正在侦听的代码行上方的套接字。现在我的问题是,当我通过按ctrl+C终止这段python代码时,上面的代码可以很好地识别远程连接关闭事件,我有机会处理它

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

在我的情况下,连接应该总是打开的,并且应该能够随机发送数据,并且只有当远程机器断电时,我的GO代码才会得到通知

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


PS-这似乎是一个非常常见的实时问题,尽管不是在测试环境中。

您需要添加某种心跳消息。然后,查看GO文档,您可以使用DialTimeout而不是Dial,每次收到心跳消息或任何其他消息时,您都可以重置超时

另一种选择是使用TCP keepalive。通过使用setsockopt,您可以在Python中实现这一点,但我无法真正帮助您实现GO,但这个链接似乎是对如何使用它启用keepalive的一个很好的描述:

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

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

您还可以使用TCP Keepalive为您执行此操作,使用启用它并设置Keepalive数据包之间的间隔。实际关闭连接所需的时间取决于系统

您还应该在拨号时设置超时,因为连接到关闭的主机并不保证返回ICMP主机无法访问的响应。您可以使用设置了
Timeout
参数的,或


只要通读stdlib文档就可以为您提供大量信息:

如果您的目标是检测连接错误,为什么要忽略连接错误?我实际上并没有忽略连接错误,但这一部分对我的问题并不重要,是吗?这就是原因,我没有提到或处理那部分。不管怎样,你认为你有办法解决我的问题吗?没有,我没有办法。你的问题对我来说仍然没有意义。我猜您希望在
net.Dial
conn.Read
之间的毫秒内,远程机器已经关闭?不,我想在成功“建立”连接后,当然是在conn.Read()之后,当远程机器断电时,在我的代码中获得一些触发器。如果python脚本被终止,我也会得到同样的结果,这将在内部触发一个信号,显式地关闭连接,我想这不会实时发生,事情可能会突然发生。如果我不能在问题本身中说明这一点,我深表歉意。要想让大家否决这个问题,我能知道原因吗?那篇文章使用了一个有严重缺陷的
tcpkeepalive
包。std库为大多数用例提供适当的设置。