我正在寻找自己的 IP 地址,以便将该信息发布到对等网络中。在 POSIX/C 中,我们有getaddrinfo(NULL, ...)
,但这似乎总是返回INADDR_ANY
or INADDR_LOOPBACK
,这对我来说没用。
有什么建议么?
我正在寻找自己的 IP 地址,以便将该信息发布到对等网络中。在 POSIX/C 中,我们有getaddrinfo(NULL, ...)
,但这似乎总是返回INADDR_ANY
or INADDR_LOOPBACK
,这对我来说没用。
有什么建议么?
问题之一是,即使您获得了本地 IP 地址,Internet 其余部分看到的 IP 地址也可能不同,因为不幸的是, NAT的杂乱无章非常普遍。使用 IPv6 可能会抑制这个问题,但现在它可能不是你的选择。
要获取公共IP 地址,您需要为此目的制定的协议,例如STUN ( RFC 5389 )。C中有公共 STUN 服务器和已经存在的STUN 客户端。
所有点对点程序都有类似的问题,所以了解其他人在做什么,我强烈建议阅读RFC 5128,“跨网络地址转换器 (NAT) 的点对点 (P2P) 通信状态”。
您说的是公共地址,您的应用程序的同行可以与您联系的地址。唯一完全证明的方法是连接到一个已知的“外部”对等点并将您的地址发回给您。
尽管我应该指出一台计算机可以有多个 IP 地址,但我并不是想让事情变得更复杂。通常每个网卡都会有一个。
一个更具体的提问方式是“当我连接到 foo.com.org 时,如何找到将用作源地址的 IP 地址”我喜欢 bortzmeyer 对此的回答 :)
创建一个 UDP 套接字,bind() 到 INADDR_ANY,connect() 到 Internet 上的某个地址,然后在套接字上使用 getsockname() 来找出分配给它的地址。
如果网络协议支持它,另一个好的解决方案是询问您的引导同行他们认为您的 IP 是什么。这会自动处理 NAT。
您是否检查ai_next
了返回结构的字段?
getaddrinfo()
返回地址的链表。
如果您知道您的主机名称,您可以使用 gethostbyname 来获取 IP 地址。