我希望获取自己的IP地址,以便将该信息发布到点对点网络中。在POSIX / C中我们有getaddrinfo(NULL, ...)
,但这似乎总是返回INADDR_ANY
或INADDR_LOOPBACK
,这对我来说毫无用处。
有什么建议吗?
答案 0 :(得分:4)
其中一个问题是,即使您获得本地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)"。
答案 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地址。