我正在启动一个例程并在网络侦听器(HTTP)上进行侦听。我想关闭监听器,关闭例程并启动一个新例程,然后重新启动监听器。当我关闭听众时,一切都会崩溃。
(listener
是全球性的)
listener, _ = net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
go PassThrough()
,其中
func PassThrough() {
verbose := flag.Bool("v", false, "should every proxy request be logged to stdout")
flag.Parse()
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = *verbose
log.Fatal(http.Serve(listener, proxy))
}
所以这可以工作,但是如果我想停止passThrough()并重新将侦听器应用于另一个任务(例如一个不同的代理“job”),那么用listener.Close()
关闭监听器会导致它被破坏试着重新聆听并召唤一个新的例程。
我收到错误:
ProxyControllers.go:146: accept tcp 127.0.0.1:8080: use of closed network connection
reverseproxy.go:141: http: proxy error: EOF
然后我尝试重用Listener。
我想当我关闭()听众时,我需要告诉例程以某种方式关闭自己?
我正在使用goproxy库
答案 0 :(得分:1)
init
func。Listen
。log.Fatal
,这将终止您的计划。示例:
var verbose = flag.Bool("v", false, "should every proxy request be logged to stdout")
func runProxy(typ, host, port string) (listener tcp.Listener) {
listener, _ = net.Listen(typ, host+":"+port)
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = *verbose
go http.Serve(listener, proxy) // you can probably ignore this error
return
}
func main() {
flag.Parse()
l := runProxy(....)
//do something
l.Close()
l = runProxy(....)
//....
}