gpt4 book ai didi

go - 如何获取 http.ListenAndServe 的地址

转载 作者:IT王子 更新时间:2023-10-29 01:21:21 24 4
gpt4 key购买 nike

假设我像这样启动一个服务器:

srv := http.Server{
Addr: ":0",
Handler: http.FileServer(http.Dir(".")),
}
go srv.ListenAndServe()
log.Printf("Listening on ???")

我如何知道选择了哪个端口? :0 旨在由操作系统选择一个随机的临时端口,但我需要知道选择了哪个端口。

注意:我希望创建我自己的监听器并使用srv.Listen(ln),因为srv。 ListenAndServe() 有一个很好的默认(但未导出)监听器,我想使用它。

最佳答案

I would prefer not to create my own listener and use srv.Listen(ln), since srv.ListenAndServe() has a good default (but unexported) listener that I want to use.

为什么不呢? ListenAndServe() 非常容易自己实现。你可以read the source code为自己:

func (srv *Server) ListenAndServe() error {
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}

答案是您需要使用自己的 ListenAndServe() 来为您提供所需的信息。然而,这比您相信的要容易得多。整个事情不超过 20 行(假设你想用 tcpKeepAliveListener 设置保持事件状态)。

关于go - 如何获取 http.ListenAndServe 的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632506/

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