C++ - getaddrinfo() - 使用动态 dns 获取自己的外部 IP 失败

Posted

技术标签:

【中文标题】C++ - getaddrinfo() - 使用动态 dns 获取自己的外部 IP 失败【英文标题】:C++ - getaddrinfo() - getting own external IP with dynamic dns fails 【发布时间】:2015-01-25 17:41:28 【问题描述】:

我目前正在开发一个程序,该程序可以告诉我我的外部 IP 等信息。为此,我使用了函数getaddrinfo()。 出于测试目的,我通过 google.com 作为节点名称,它运行良好。 如果我将动态 dns 传递给函数,我会收到 0.0.0.0 作为 IP,但我期待自己的外部 IP。我还尝试了来自朋友的动态 dns,结果相同。 就我可以从google.com 获取 IP 而言,问题不应该出在我的代码上。是否不可能从具有 getaddrinfo() 的动态 dns 接收 IP 或者还有其他什么我做错了吗?

编辑:

WSADATA wsaD ;
addrinfo hints = AI_NON_AUTHORITATIVE, AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, NULL, NULL, NULL;
addrinfo *infoAddress;
WSAStartup(MAKEWORD(2, 2), &wsaD);
getaddrinfo("daniel-nas.computer", "80", &hints, &infoAddress);
struct sockaddr_in *ipAddress = reinterpret_cast<sockaddr_in*>&infoAddress->ai_addr);
inet_ntop(AF_INET, &ipAddress->sin_addr.s_addr, IP, sizeof(IP));
WSACleanup();

IP 是全球定义的:char IP[INET_ADDRSTRLEN];还有其他人解决过这个问题吗?

【问题讨论】:

你的动态 dns 是什么意思? @Wimmel 就我得到一个每 24 小时更改一次的动态 IP 而言,我得到了一个指向我的动态地址的动态 dns (daniel-nas.computer)。这个动态 dns 每 24 小时更新一次。这就是我要传递给getaddrinfo() 的地址。 好的,这是您的提供商提供的动态 dns 服务。我认为这应该可行(如果您也可以在您的 PC 上的其他软件中使用主机名)。我不知道为什么它不适合你。 @Wimmel 虽然我的提供商没有提供该服务,但它运行良好。我将它用于我的 NAS、我的网站和其他东西。但如果我将它传递给getaddrinfo(),我只会收到0.0.0.0 作为IP 地址。 如果您尝试 nslookup / dig 您正在查找的 DNS 名称,您会得到什么?你传递了什么标志 getaddrinfo? 【参考方案1】:

[解决方案] 作为一种解决方案,我正在使用函数gethostbyname()。尽管如此,我对它并不满意,因为该功能已被弃用,但我现在能够获得我的 IP。因此我认为,问题要么是我的代码,虽然我可以解析其他主机名,要么是函数getaddrinfo() 和 DDNS 的组合。

【讨论】:

以上是关于C++ - getaddrinfo() - 使用动态 dns 获取自己的外部 IP 失败的主要内容,如果未能解决你的问题,请参考以下文章

瞳孔阈值(眼动追踪)- 使用 C++ 的 OpenCV

C++多态(静多态和动多态)

getaddrinfo() 连续失败并出现 EAI_AGAIN

如何使用 getaddrinfo()?

带有 systemd 的 getaddrinfo() API

如何在 Windows 上使用 getaddrinfo()