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

时间:2009-05-25 05:08:11

标签: c networking ip-address posix

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

有什么建议吗?

6 个答案:

答案 0 :(得分:4)

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

要获取公开 IP地址,您需要为此目的制定协议,例如STUNRFC 5389)。有public STUN servers且已存在STUN clients in C

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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