gpt4 book ai didi

http - Go net listener 关闭及常规处理

转载 作者:数据小太阳 更新时间:2023-10-29 03:41:29 25 4
gpt4 key购买 nike

我正在开始例行程序并在网络监听器 (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() 并将监听器重新应用于不同的任务(例如不同的代理“工作”),则使用 listener.Close() 关闭监听器导致它在我尝试重新收听并调用新的 go 例程时中断。

我得到错误:

ProxyControllers.go:146: accept tcp 127.0.0.1:8080: use of closed network connection
reverseproxy.go:141: http: proxy error: EOF

然后当我尝试重用 Listener 时。

我想我需要告诉例程在关闭()监听器时以某种方式自行关闭?

我正在使用 goproxy图书馆

最佳答案

  1. Flags 应该只解析一次并且可能在 init func 中解析。
  2. 您不能重复使用监听器,您将不得不再次调用 Listen
  3. 不要调用 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(....)
//....
}

关于http - Go net listener 关闭及常规处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com