C-获取外部IP地址
我需要通过 C/C++ 调用获取我的公共 IP 地址。我知道作为替代方案,我可以从“http://whatismyip.akamai.com”等外部链接获取
我写了一个示例来获取外部 IP 地址。但是我的程序没有返回外部 IP 地址。我正在获取内部 IP 地址。我在这里错过了什么吗?
如果无法通过这种方式,我可以读取 DNS 并获取 IP 地址吗?或者有什么方法可以使用 C API 以编程方式获取外部 IP 地址(不是通过访问某个网站)?
#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
int main (int argc, const char * argv[]) {
struct ifaddrs * ifAddrStruct=NULL;
struct ifaddrs * ifa=NULL;
void * tmpAddrPtr=NULL;
getifaddrs(&ifAddrStruct);
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr) {
continue;
}
if (ifa->ifa_addr->sa_family == AF_INET) {
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
printf("%s IP Address %sn", ifa->ifa_name, addressBuffer);
} else if (ifa->ifa_addr->sa_family == AF_INET6) {
tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("%s IP Address %sn", ifa->ifa_name, addressBuffer);
}
}
if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
return 0;
}
注意:我确实有外部 IP 地址,我可以在运行 curl http://whatismyip.akamai.com时获得它
回答
“外部IP”是网络的属性;不是连接到网络的计算机的属性。因此,您无法调用任何函数来从标准库或操作系统中获取此类信息,因为系统不知道这些信息。
我写了一个示例来获取外部 IP 地址。
您编写了一个程序来获取网络接口的 IP 地址。如果接口连接到公共网络,则 IP 是外部的。如果接口连接到专用网络,则 IP 是内部的。
通过专用网络获取外部 IP 的解决方案是连接到可以查看请求来自的 IP 的外部服务。你似乎已经知道这一点。
一种不需要外部连接的更高级的方法是在路由器系统上运行类似的服务。正如评论中指出的那样,UPnP 或更具体地说,IGD是路由器可能提供的服务。C++ 标准和 POSIX 都没有提供标准的 UPnP 客户端。