【问题标题】:C Get IP for listening serverC 获取监听服务器的 IP
【发布时间】:2012-03-25 13:15:07
【问题描述】:

我正在使用 C 套接字编写客户端/服务器程序。我指定服务器可以通过在 sockaddr_in.sin_addr.s_addr 中使用 INADDR_ANY 来侦听任何网络接口。这相当于 0.0.0.0 的 IP。我是否有可能获得服务器正在侦听的实际 IP? (例如 192.168.1.100)

【问题讨论】:

  • 建立连接之前还是之后?服务器可能正在监听多个地址。
  • 之前。就我而言,我只会拥有一个 IP。只是我让系统决定。但我还是想知道它决定了什么。
  • 服务器将监听所有可用的接口。即使是一个接口也可能有多个 IP 地址。
  • 那么这是枚举您的网络接口及其地址的一种特殊情况——当然,您也有环回设备和地址。看起来这应该会有所帮助:stackoverflow.com/questions/1160963/…
  • 不涉及多个接口/IP 的复杂性......假设我的机器的 IP 地址为 192.168.1.100。我只想在绑定套接字后以编程方式检索它。 @blueshift 的链接可能会有所帮助,但我认为可能有更简单的解决方案。

标签: c sockets


【解决方案1】:

当您将侦听套接字绑定到INADDR_ANY 时,该套接字将侦听所有可用的本地 IP。无法从套接字确定它正在侦听的 IP。如果您需要该信息,那么您必须单独枚举本地 IP(在这种情况下,如果您需要检索预先接受的绑定详细信息,您可以将每个 IP 单独 bind() 到其自己的套接字)。但是,一旦accept() 返回了已建立的客户端连接,您可以在接受的套接字上使用getsockname() 来了解哪个特定 IP 接受了连接。

【讨论】:

    【解决方案2】:

    我终于找到了solution that works

    编辑:链接已失效,请参阅:Internet Archive link

    希望它能像对我一样对其他人有所帮助。

    【讨论】:

    • 我希望您不需要 IPv6 支持,因为这不适用于 IPv6。
    • 不,我不知道。但是,如果您解释为什么它不适合,它可能会对那些这样做的人有所帮助。我认为使用的函数调用具有 IPv6 等价物。
    • getaddrinfo 函数(linux docsWindows docs)支持 IPv6 并执行相同的功能。
    • 您的链接已失效(据说是暂时的)。
    • @FakeName 我添加了一个互联网存档链接来补偿。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多