【问题标题】:What is the difference in listening on "0.0.0.0:80" and ":80"?听“0.0.0.0:80”和“:80”有什么区别?
【发布时间】:2018-08-10 13:15:24
【问题描述】:

当我们使用http.ListenAndServe时,有什么区别:

http.ListenAndServe("0.0.0.0:80", nil)

http.ListenAndServe(":80", nil)

?难道两个版本都不会监听端口80上的所有接口吗?

【问题讨论】:

  • 可能"0.0.0.0:80" 只是绑定在 ipv4 接口上?
  • 似乎你是对的,但在 Linux 上(我没有提到我使用它)这并不明显,因为 bindv6only 选项(在 SO 回答 serverfault.com/a/39561/78427 中描述)。基本上在大多数发行版上,bindv6only 为 0,因此如果创建一个套接字来监听 IPv6,它也会监听 IPv4

标签: http go port


【解决方案1】:

http.ListenAndServe() 函数最终调用net.Listen()net.Listen 的文档声明它将绑定到提供给它的网络:

对于 TCP 网络,如果地址参数中的主机为空或文字未指定的 IP 地址,Listen 将侦听本地系统的所有可用单播和任播 IP 地址。要仅使用 IPv4,请使用网络“tcp4”。

但是,查看http.ListenAndServe() 的源代码,我们可以看到它指定"tcp" 为网络,而不是"tcp4"。因此,您的示例代码中的调用应该产生相同的行为,即两个调用都应该绑定到所有可用的接口。然而,进一步深入挖掘我们最终在internetAddrList() 中的golang 源代码,我们可以看到它区分了一个空的host 值和一个指定了ipv4 地址的值。因此,golang 实际上确实将指定的 ipv4 地址视为仅在该接口上绑定的指示。

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2017-08-05
    • 1970-01-01
    • 2013-06-22
    • 2018-12-03
    • 2014-01-02
    • 2020-06-07
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多