【问题标题】:C++ - getaddrinfo() - getting own external IP with dynamic dns failsC++ - getaddrinfo() - 使用动态 dns 获取自己的外部 IP 失败
【发布时间】: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?

标签: c++ dynamic dns getaddrinfo


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多