在我的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-这似乎是一个非常常见的实时问题,虽然不是在测试环境中。你知道吗
你需要添加一些心跳信号。然后,查看GO文档,您可以使用DialTimeout而不是Dial,每次收到心跳消息或任何其他消息时都可以重置超时。你知道吗
另一种选择是使用TCP keepalive。在Python中,可以使用setsockopt来实现这一点,但我不能真正帮助您使用GO,但是这个链接似乎是对如何启用keepalive的一个很好的描述: http://felixge.de/2014/08/26/tcp-keepalive-with-golang.html
无法确定已关闭的主机和已断开的连接之间的区别,因此您将以相同的方式对待它们。你知道吗
您可以自己发送心跳消息,并在心跳数据包之间达到某个超时时间时关闭连接。超时时间可以通过对数据包计时来手动设置,也可以在每次读取之前使用^{} 在到达截止日期时立即终止连接。你知道吗
您还可以使用TCP Keepalive来实现这一点,使用^{} 来启用它,^{} 来设置Keepalive数据包之间的间隔。实际关闭连接所需的时间将取决于系统。你知道吗
拨号时还应设置超时,因为连接到关闭的主机不一定会返回ICMP主机无法访问的响应。您可以使用^{} 、带有} 或^{} 。你知道吗
Timeout
参数集的^{只要通读stdlib文档就可以提供大量信息:https://golang.org/pkg/net/
相关问题 更多 >
编程相关推荐