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 失败的主要内容,如果未能解决你的问题,请参考以下文章
getaddrinfo() 连续失败并出现 EAI_AGAIN