我在关闭侦听器时遇到麻烦,因此我可以在同一端口上重新打开它。我正在编写可热配置的代理服务器-即它的功能(重定向/块等)可以随时进行调整。代理在go例程中运行。我遇到的问题是当我重新配置侦听器和代理时,侦听器仍在使用先前配置中的该端口。 (FYI侦听器是全局指针)
我正在尝试类似:
杀死听众:
func KillProxy() {
if listener != nil {
log.Println(" *** TRYING TO STOP THE PROXY SERVER")
(*listener).Close()
listener = nil
}
}
在像这样重新配置它之前:log.Println("listener (S1): ", listener)
if listener == nil {
// Start the listener to listen on the connection.
l, err := net.Listen(CONN_TYPE, CONN_HOST + ":" + CONN_PORT)
if err != nil {
log.Println("error here: ", err)
}
listener = &l //set it as a pointer to the newly created listener
}
log.Println("listener (S2): ", listener)
但是,这似乎不起作用-我得到了错误:然后是一个庞大的堆栈跟踪,总结为:
针对吉姆进行编辑:
有趣的重新指针。好的。我没有等待套接字关闭,我不确定该怎么做。我正在使用的代理库就是这个:https://github.com/abourget/goproxy。发生的顺序是:
KillProxy()
refreshProxy()
refreshProxy包含上面发布的试图重新利用侦听器的代码。 refreshProxy()
中发生的最后一件事是:go http.Serve(*listener, proxy)
因此,如果我将监听器恢复为全局变量,而不是指针,则可以使用KillProxy():func KillProxy() {
if listener != nil {
listener.Close()
listener = nil
}
}
然后再次将监听器设置为listener, err := net.Listen(CONN_TYPE, CONN_HOST + ":" + CONN_PORT)
if err != nil {
log.Println("error here: ", err)
}
但是我不知道如何等待并尝试重新创建侦听器对象之前检查套接字是否已关闭? 最佳答案
好的,这远非完美,但是我发现没有错误提示的唯一方法是人为地延迟代码,以便套接字有时间关闭。
这不是很好,因为这意味着在套接字关闭时代理已关闭2秒钟,但至少不会出错。
如果有人有更好的解决方案,我想听听
func KillProxy() {
if listener != nil {
listener.Close()
log.Println("waiting for socket to close")
time.Sleep(2 * time.Second)
}
}
关于go - Golang关闭网络监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30952623/