假设我像这样启动服务器: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)。
- 3 回答
- 0 关注
- 234 浏览
添加回答
举报
0/150
提交
取消