我在golang中有一个设置,它基本上是从OS获得一个免费端口,然后在它上面启动一个http服务器。它开始在端口注册失败时发出随机错误。我将其简化为以下程序,该程序在获取一些空闲端口后似乎出现了错误。它非常随机地发生,并且没有真正的进程在它出错的端口上运行。这对我来说没有任何意义,为什么这必须出错。任何帮助都将不胜感激。
程序输出:
..
..
58479
..
..
58867
58868
58869
..
绑定得很好!58867
绑定得很好!58868
绑定得很好!58869
..
..
..
2015/04/28 09:05:09绑定端口时出错:侦听tcp :58479: bind: address已在使用中
我确保检查出现的空闲端口不会重复。
package main
import (
"net"
"net/http"
"log"
"fmt"
)
func main() {
for {
l, _ := net.Listen("tcp", ":0")
var port = l.Addr().String()[5:]
l.Close()
fmt.Println(port)
go func() {
l1, err := net.Listen("tcp", ":"+port)
if (err != nil) {
log.Fatal("Error while binding port: ", err.Error())
} else {
fmt.Println("bound well! ", port)
}
http.Serve(l1, nil)
}()
}
}发布于 2021-03-01 08:03:56
您以前可能正在此端口上运行或调试应用程序,但它没有完全关闭。该进程可能仍挂在您的系统内存中。完全终止该进程,以及可能潜伏在阴影中的任何其他网络守护进程,并尝试再次运行您的应用程序。
如果您还没有检查过这一点,您可以使用(如果使用Linux)
,或任何GUI系统监视器,如Windows
,Gnome3's
或者KDE
搜索违规进程。
例如,我观察到Visual Studio Code的调试器/运行器实用程序( F5 /Ctrl+F5)并不总是清理进程,特别是当您太快地点击F5并且旧的调试器没有关闭时。
https://stackoverflow.com/questions/29924910
复制相似问题