3

我正在寻找自己的 IP 地址,以便将该信息发布到对等网络中。在 POSIX/C 中,我们有getaddrinfo(NULL, ...),但这似乎总是返回INADDR_ANYor INADDR_LOOPBACK,这对我来说没用。

有什么建议么?

4

6 回答 6

5

问题之一是,即使您获得了本地 IP 地址,Internet 其余部分看到的 IP 地址也可能不同,因为不幸的是, NAT的杂乱无章非常普遍。使用 IPv6 可能会抑制这个问题,但现在它可能不是你的选择。

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

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

于 2009-05-26T14:13:34.057 回答
1

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

于 2009-05-25T06:07:42.067 回答
1

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

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

于 2009-06-12T23:18:36.987 回答
0

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

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

于 2009-05-25T05:12:35.957 回答
0

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

getaddrinfo()返回地址的链表。

于 2009-05-25T05:31:50.660 回答
-1

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

于 2009-05-25T06:58:53.480 回答