【问题标题】:Obtaining Own External IP Address in POSIX C在 POSIX C 中获取自己的外部 IP 地址
【发布时间】:2010-10-28 16:06:18
【问题描述】:

我正在寻找自己的 IP 地址,以便将该信息发布到对等网络。在 POSIX/C 中,我们有 getaddrinfo(NULL, ...),但这似乎总是返回 INADDR_ANYINADDR_LOOPBACK,这对我来说没用。

有什么建议吗?

【问题讨论】:

    标签: c networking ip-address posix


    【解决方案1】:

    其中一个问题是,即使你获得了本地IP地址,互联网上其他人看到的IP地址也可能不同,因为NAT的杂乱无章很不幸很常见。使用 IPv6 可能会抑制这个问题,但现在它可能不是你的选择。

    要获得公共 IP 地址,您需要为此目的制定的协议,例如STUN (RFC 5389)。有public STUN servers 和已经存在的STUN clients in C

    所有点对点程序都有类似的问题,所以了解其他人在做什么,我强烈推荐阅读RFC 5128, "State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs)"

    【讨论】:

      【解决方案2】:

      您所说的公共地址是指您的应用程序的同行可以与您联系的地址。唯一的完整证明方法是连接到一个已知的“外部”对等点并将您的地址发回给您。

      【讨论】:

      【解决方案3】:

      我并不是想让事情变得更复杂,但我应该指出一台计算机可以有多个 IP 地址。通常每个网卡都会有一个。

      更具体的提问方式是“我如何找到连接到 foo.com.org 时用作源地址的 IP 地址”我喜欢 bortzmeyer 对此的回答 :)

      【讨论】:

        【解决方案4】:

        您是否检查了返回结构的ai_next 字段?

        getaddrinfo() 返回地址链表。

        【讨论】:

        • "但这似乎总是返回 INADDR_ANY 或 INADDR_LOOPBACK" 我正在遍历列表.. 所以是的。
        【解决方案5】:

        创建一个 UDP 套接字,bind() 到 INADDR_ANY,connect() 到 Internet 上的某个地址,然后在套接字上使用 getsockname() 来找出分配给它的地址。

        如果网络协议支持的话,另一个很好的解决方案是询问您的引导同行他们认为您的 IP 是什么。这会自动处理 NAT。

        【讨论】:

        • 尝试了第一种方法。使用 UDP 套接字,它给了我 0.0.0.0 (INADDR_ANY)。我可能会考虑第二种方法。
        • 当“询问你的引导同行他们认为你的 IP 是什么”时,有几个陷阱。最好避免重新发明轮子并使用 STUN 等现有协议。
        【解决方案6】:

        如果您知道您的主机名称,您可以使用 gethostbyname 来获取 IP 地址。

        【讨论】:

        • gethostbyname 已弃用多年(由 getaddrinfo 取代)。在它的问题中,它是特定于 IPv4 的。
        猜你喜欢
        • 2021-11-20
        • 1970-01-01
        • 2017-01-26
        • 2011-02-25
        • 1970-01-01
        • 2013-04-03
        • 2016-03-10
        • 1970-01-01
        相关资源
        最近更新 更多