我希望获得自己的IP地址,以便将该信息发布到点对点网络中。在POSIX/C中,我们有
有什么建议吗?
getaddrinfo(NULL, ...)
,但它似乎总是返回INADDR_ANY
或INADDR_LOOPBACK
,这对我没有用处。有什么建议吗?
getaddrinfo(NULL, ...)
,但它似乎总是返回INADDR_ANY
或INADDR_LOOPBACK
,这对我没有用处。其中一个问题是,即使您获得了本地IP地址,由于NAT的混乱(这种情况非常普遍),互联网上看到的IP地址可能会有所不同。使用IPv6可能会解决此问题,但现在可能不是您的选择。
要获取公共 IP地址,您需要使用专门用于此目的的协议,例如STUN(RFC 5389)。有公共STUN服务器和已经存在的C中的STUN客户端。
所有的点对点程序都有类似的问题,所以要学习其他人正在做什么,我强烈推荐阅读RFC 5128,“网络地址转换器(NAT)跨点对点(P2P)通信的状态”。
通过公共地址,你是在说一个地址,你的应用程序同行可以用它联系你。唯一可靠的方法是连接到已知的“外部”同行,并让它将你的地址发送回给你。
虽然我不想让事情变得更加复杂,但我应该指出一台计算机可以有多个IP地址。通常每个网络卡都会有一个。
更具体的询问方式是“当我连接到foo.com.org时,如何找到将用作源地址的IP地址”。我喜欢bortzmeyer的答案:)
ai_next
字段吗?
getaddrinfo()
返回地址链表。