gpt4 book ai didi

c++ - 如何在C++中获取外部IP地址?

转载 作者:可可西里 更新时间:2023-11-01 17:00:29 24 4
gpt4 key购买 nike

我如何在 C++ 中查找用户的外部 IP?我需要一种适用于任何系统的方法,而不仅仅是我的系统。此外,系统可能位于路由器后面,因此 NAT 会发挥作用,使检索外部 IP 变得更加困难。

理想情况下,我想在不使用任何第三方服务(如 whatsmyip)的情况下执行此操作。但是,我不确定这是否可能。如果我不使用第 3 方服务,我必须通过路由器,如果 ping 被禁用,我猜这可能是不可能的(我可能是错的,不太确定)。

如果我要使用像 whatsmyip 这样的第三方服务,我应该怎么做?他们有公开的网络服务吗?我看过这个链接:http://automation.whatismyip.com/n09230945.asp但它似乎没有用。是否可以使用一些 HTTP 方法获取外部 IP 并检索它,或者我是否需要有效地抓取页面以从中获取 IP?

我仅限于使用 Windows API 来完成此操作(没有第 3 方 API)

最佳答案

理论上,您可以使用 Windows uPnP API 来执行此操作。您将首先使用 UPnPDeviceFinder 枚举 Internet 网关设备。然后你得到一个网关的IUPnPRemoteEndpointInfo(好吧,通常只有一个,无论如何)并调用它的GetStringValue,传递一个包含"RemoteAddress" 获取它的远程地址(我认为指的是它的外部地址,虽然我承认我不完全确定)。哦,因为这是 COM,所以它必须是系统字符串,而不是普通字符串。

从外部供应商处获取 IP 是很多更容易。在不使用任何第 3rd 方库的情况下,它的代码如下所示:

#include <windows.h>
#include <wininet.h>
#include <string>
#include <iostream>

std::string real_ip() {

HINTERNET net = InternetOpen("IP retriever",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);

HINTERNET conn = InternetOpenUrl(net,
"http://myexternalip.com/raw",
NULL,
0,
INTERNET_FLAG_RELOAD,
0);

char buffer[4096];
DWORD read;

InternetReadFile(conn, buffer, sizeof(buffer)/sizeof(buffer[0]), &read);
InternetCloseHandle(net);

return std::string(buffer, read);
}

int main() {
std::cout << real_ip() << "\n";
}

编译:

cl ip_addr.cpp wininet.lib

注意:如果您的机器配置为使用 IPv6,这可以(并且将会)检索您的 IPv6 地址。

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

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