【发布时间】:2010-10-28 16:06:18
【问题描述】:
我正在寻找自己的 IP 地址,以便将该信息发布到对等网络。在 POSIX/C 中,我们有 getaddrinfo(NULL, ...),但这似乎总是返回 INADDR_ANY 或 INADDR_LOOPBACK,这对我来说没用。
有什么建议吗?
【问题讨论】:
标签: c networking ip-address posix
我正在寻找自己的 IP 地址,以便将该信息发布到对等网络。在 POSIX/C 中,我们有 getaddrinfo(NULL, ...),但这似乎总是返回 INADDR_ANY 或 INADDR_LOOPBACK,这对我来说没用。
有什么建议吗?
【问题讨论】:
标签: c networking ip-address posix
其中一个问题是,即使你获得了本地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)"。
【讨论】:
您所说的公共地址是指您的应用程序的同行可以与您联系的地址。唯一的完整证明方法是连接到一个已知的“外部”对等点并将您的地址发回给您。
【讨论】:
我并不是想让事情变得更复杂,但我应该指出一台计算机可以有多个 IP 地址。通常每个网卡都会有一个。
更具体的提问方式是“我如何找到连接到 foo.com.org 时用作源地址的 IP 地址”我喜欢 bortzmeyer 对此的回答 :)
【讨论】:
您是否检查了返回结构的ai_next 字段?
getaddrinfo() 返回地址链表。
【讨论】:
创建一个 UDP 套接字,bind() 到 INADDR_ANY,connect() 到 Internet 上的某个地址,然后在套接字上使用 getsockname() 来找出分配给它的地址。
如果网络协议支持的话,另一个很好的解决方案是询问您的引导同行他们认为您的 IP 是什么。这会自动处理 NAT。
【讨论】:
如果您知道您的主机名称,您可以使用 gethostbyname 来获取 IP 地址。
【讨论】: