为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取 http.ListenAndServe 的地址

如何获取 http.ListenAndServe 的地址

Go
PIPIONE 2021-10-25 16:55:01
假设我像这样启动服务器:srv := http.Server{    Addr:    ":0",    Handler: http.FileServer(http.Dir(".")),}go srv.ListenAndServe()log.Printf("Listening on ???")我怎么知道选择了哪个端口?:0旨在由操作系统选择一个随机的临时端口,但我需要知道选择了哪个端口。注意:我宁愿不创建自己的监听器和使用srv.Listen(ln),由于srv.ListenAndServe()具有良好的默认值(但不导出),我想使用监听器。
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

我不想创建我自己的侦听器并使用 srv.Listen(ln),因为 srv.ListenAndServe() 有一个我想使用的很好的默认(但未导出)侦听器。


为什么不?ListenAndServe() 实现起来非常简单。你可以自己阅读源代码:


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设置 keep- alives)。


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信