在POSIX C中获取自己的外部IP地址

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

有什么建议?

其中一个问题是,即使您获得本地IP地址,互联网其他部分所看到的IP地址可能也不同,因为NAT的kludge很遗憾很常见。 使用IPv6可能会抑制此问题,但现在可能不适合您。

要获取公共 IP地址,您需要为此目的制定协议,例如STUN ( RFC 5389 )。 C中有公共STUN服务器和已存在的STUN客户端 。

所有点对点程序都有类似的问题,所以要了解其他人在做什么,我强烈建议阅读RFC 5128,“跨网络地址转换器(NAT)的对等(P2P)通信状态” 。

通过公共地址,您可以说,您的应用程序的同行可以与您联系的地址。 唯一完全certificate的方法是连接到一个已知的“外部”对等方并让它将您的地址发回给您。

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

一个更具体的问题是“当我连接到foo.com.org时,如何找到将用作源地址的IP地址”我喜欢bortzmeyer的答案:)

你检查了返回结构的ai_next字段了吗?

getaddrinfo()返回链接的地址列表。

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

如果网络协议支持它,另一个好的解决方案就是向你的自举对等方询问他们认为你的IP是什么。 这会自动处理NAT。

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