gpt4 book ai didi

c++ - C - 获取外部 IP 地址

转载 作者:行者123 更新时间:2023-12-05 08:48:51 26 4
gpt4 key购买 nike

我需要通过 C/C++ 调用获取我的公共(public) 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 %s\n", 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 %s\n", ifa->ifa_name, addressBuffer);
}
}
if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
return 0;
}

注意:我确实有外部 IP 地址,我可以在运行时获取它 curl http://whatismyip.akamai.com

最佳答案

“外部 IP”是网络的属性;不是连接到网络的计算机的属性。因此,您无法调用函数从标准库或操作系统获取此类信息,因为系统不知道这些信息。

I wrote a sample to get external IP address.

您编写了一个程序来获取网络接口(interface)的 IP 地址。如果接口(interface)连接到公共(public)网络,则 IP 是外部的。如果接口(interface)连接到专用网络,则 IP 是内部的。


通过专用网络获取外部 IP 的一种解决方案是连接到可以查看请求来源 IP 的外部服务。您似乎已经知道这一点。

一种不需要外部连接的更高级方法是在路由器系统上运行类似的服务。正如评论中指出的那样,UPnP 或更具体地说,IGD是路由器可能提供的服务。 C++ 标准和 POSIX 都没有提供标准的 UPnP 客户端。

关于c++ - C - 获取外部 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65348174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com