我有一个Go应用程序,它取决于本地服务的存在。它可以在三种初始情况下运行。
要弄清楚该服务在哪种情况下运行,tt会检查该服务是否已在主机上运行,如果可用,则不执行任何操作,一切正常。方案1)显然处于工作状态,但是,如果该服务已安装在主机上但未运行,则它将启动它并等待端口可用,这就是麻烦的开始。
当前,它通过等待直到可以与该服务可用的端口建立连接来确定该服务是否准备就绪。
func Available() bool {
for i := 1; i < 10; i++ {
conn, err := net.Dial("tcp4", net.JoinHostPort(loopbackInterface(), "8051"))
if err != nil {
log.Println("Connecting error:", err)
}
if conn != nil {
conn.Close()
return true
}
// The time it can take for the service to become available is pretty variable, the first time can be 2-3 minutes, subsequent times could only be a few seconds. I'll dial this in more precisely later.
time.Sleep(time.Duration(i*10) * time.Second)
}
return false
}
这在OSX和GNU / Linux上可靠地运行,但是当我进入Windows时,该服务启动了,我可以进入powershell了,并且该端口实际上在Get-Process -Id (Get-NetTCPConnection -LocalPort 8051).OwningProcess
中变得可用,但是无论如何,我永远无法从我的应用程序连接到该端口。这似乎是绝对奇怪的行为,但是,对于新的虚拟机和硬件来说都是如此。因此,仅在Windows上,情况2)和3)完全被破坏了。
在我看来,这些系统(Windows应用程序防火墙?)之间存在一些差异,这是导致此问题的原因,但是我无法确认任何原因或找到解决问题的方法。
那我该如何:启动外部应用程序,等待端口可用,然后从部署到Windows 10 PC的Go应用程序连接到该端口?