mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-22 07:14:15 +08:00
style: Change files encoding format to UTF8-BOM
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#pragma once
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <winsock2.h>
|
||||
#include <iphlpapi.h>
|
||||
@@ -37,8 +37,8 @@ inline void splitIpPort(const std::string& input, std::string& ip, std::string&
|
||||
}
|
||||
|
||||
/**
|
||||
* IPConverter: IP <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬<EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡIP<EFBFBD><EFBFBD>Ӧ<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD>.
|
||||
* Ŀǰ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>API<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD>ѯ<EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
* IPConverter: IP 操作类,用于获取公网IP,获取IP对应的地理位置等.
|
||||
* 目前是通过调用公开的互联网API完成,假如该查询网站不可访问则需要重新适配.
|
||||
*/
|
||||
class IPConverter
|
||||
{
|
||||
@@ -49,23 +49,23 @@ public:
|
||||
}
|
||||
|
||||
/**
|
||||
* <EFBFBD>жϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP <20><>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP
|
||||
* @param ipAddress IP <EFBFBD><EFBFBD>ַ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "192.168.1.1"<EFBFBD><EFBFBD>
|
||||
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
||||
* 判断给定的 IP 地址是否是局域网(内网)IP
|
||||
* @param ipAddress IP 地址字符串(如 "192.168.1.1")
|
||||
* @return 如果是局域网 IP,返回 true; 否则返回 false
|
||||
*/
|
||||
bool IsPrivateIP(const std::string& ipAddress)
|
||||
{
|
||||
// <EFBFBD><EFBFBD> IP <EFBFBD><EFBFBD>ַ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD>ʽ
|
||||
// 将 IP 地址字符串转换为二进制格式
|
||||
in_addr addr;
|
||||
if (inet_pton(AF_INET, ipAddress.c_str(), &addr) != 1) {
|
||||
Mprintf("Invalid IP address: %s\n", ipAddress.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP <20><>ַת<D6B7><D7AA>Ϊ<EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 将二进制 IP 地址转换为无符号整数
|
||||
unsigned long ip = ntohl(addr.s_addr);
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP <20><>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>
|
||||
// 检查 IP 地址是否在局域网范围内
|
||||
if ((ip >= 0x0A000000 && ip <= 0x0AFFFFFF) || // 10.0.0.0/8
|
||||
(ip >= 0xAC100000 && ip <= 0xAC1FFFFF) || // 172.16.0.0/12
|
||||
(ip >= 0xC0A80000 && ip <= 0xC0A8FFFF) || // 192.168.0.0/16
|
||||
@@ -76,13 +76,13 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
||||
// 获取本机地理位置
|
||||
std::string GetLocalLocation()
|
||||
{
|
||||
return GetGeoLocation(getPublicIP());
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ IP <EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>[ipinfo.io])
|
||||
// 获取 IP 地址地理位置(基于[ipinfo.io])
|
||||
std::string GetGeoLocation(const std::string& IP)
|
||||
{
|
||||
if (IP.empty()) return "";
|
||||
@@ -98,14 +98,14 @@ public:
|
||||
DWORD bytesRead;
|
||||
std::string readBuffer;
|
||||
|
||||
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> WinINet
|
||||
// 初始化 WinINet
|
||||
hInternet = InternetOpen("IP Geolocation", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
||||
if (hInternet == NULL) {
|
||||
Mprintf("InternetOpen failed! %d\n", GetLastError());
|
||||
return "";
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> HTTP <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 创建 HTTP 请求句柄
|
||||
std::string url = "http://ipinfo.io/" + ip + "/json";
|
||||
hConnect = InternetOpenUrlA(hInternet, url.c_str(), NULL, 0, INTERNET_FLAG_RELOAD, 0);
|
||||
if (hConnect == NULL) {
|
||||
@@ -114,13 +114,13 @@ public:
|
||||
return "";
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 读取返回的内容
|
||||
char buffer[4096];
|
||||
while (InternetReadFile(hConnect, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
|
||||
readBuffer.append(buffer, bytesRead);
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> JSON <EFBFBD><EFBFBD>Ӧ
|
||||
// 解析 JSON 响应
|
||||
Json::Value jsonData;
|
||||
Json::Reader jsonReader;
|
||||
std::string location;
|
||||
@@ -128,7 +128,7 @@ public:
|
||||
if (jsonReader.parse(readBuffer, jsonData)) {
|
||||
std::string country = jsonData["country"].asString();
|
||||
std::string city = jsonData["city"].asString();
|
||||
std::string loc = jsonData["loc"].asString(); // <EFBFBD><EFBFBD>γ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
std::string loc = jsonData["loc"].asString(); // 经纬度信息
|
||||
if (city.empty() && country.empty()) {
|
||||
} else if (city.empty()) {
|
||||
location = country;
|
||||
@@ -144,7 +144,7 @@ public:
|
||||
Mprintf("Failed to parse JSON response: %s.\n", readBuffer.c_str());
|
||||
}
|
||||
|
||||
// <EFBFBD>رվ<EFBFBD><EFBFBD><EFBFBD>
|
||||
// 关闭句柄
|
||||
InternetCloseHandle(hConnect);
|
||||
InternetCloseHandle(hInternet);
|
||||
|
||||
@@ -158,7 +158,7 @@ public:
|
||||
|
||||
bool isLocalIP(const std::string& ip)
|
||||
{
|
||||
if (isLoopbackAddress(ip)) return true; // <EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
if (isLoopbackAddress(ip)) return true; // 先检查回环地址
|
||||
|
||||
ULONG outBufLen = 15000;
|
||||
IP_ADAPTER_ADDRESSES* pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
|
||||
@@ -185,29 +185,29 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP, <20><>ȡʧ<C8A1>ܷ<EFBFBD><DCB7>ؿ<EFBFBD>
|
||||
// 获取公网IP, 获取失败返回空
|
||||
std::string getPublicIP()
|
||||
{
|
||||
clock_t t = clock();
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>ѯԴ
|
||||
// 多个候选查询源
|
||||
static const std::vector<std::string> urls = {
|
||||
"https://checkip.amazonaws.com", // ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
"https://api.ipify.org", // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>
|
||||
"https://ipinfo.io/ip", // <EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD>
|
||||
"https://icanhazip.com", // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
"https://ifconfig.me/ip" // ĩλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
"https://checkip.amazonaws.com", // 全球最稳
|
||||
"https://api.ipify.org", // 主流高可用
|
||||
"https://ipinfo.io/ip", // 备用方案
|
||||
"https://icanhazip.com", // 轻量快速
|
||||
"https://ifconfig.me/ip" // 末位兜底
|
||||
};
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> WinINet <EFBFBD>Ự
|
||||
// 打开 WinINet 会话
|
||||
HINTERNET hInternet = InternetOpenA("Mozilla/5.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
||||
if (!hInternet) {
|
||||
Mprintf("InternetOpen failed. cost %d ms.\n", clock() - t);
|
||||
return "";
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ (<28><><EFBFBD><EFBFBD>)
|
||||
DWORD timeout = 3000; // 3 <EFBFBD><EFBFBD>
|
||||
// 设置超时 (毫秒)
|
||||
DWORD timeout = 3000; // 3 秒
|
||||
InternetSetOptionA(hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &timeout, sizeof(timeout));
|
||||
InternetSetOptionA(hInternet, INTERNET_OPTION_SEND_TIMEOUT, &timeout, sizeof(timeout));
|
||||
InternetSetOptionA(hInternet, INTERNET_OPTION_RECEIVE_TIMEOUT, &timeout, sizeof(timeout));
|
||||
@@ -216,7 +216,7 @@ public:
|
||||
char buffer[2048];
|
||||
DWORD bytesRead = 0;
|
||||
|
||||
// <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD>ͬ IP <20><>ѯԴ
|
||||
// 轮询不同 IP 查询源
|
||||
for (const auto& url : urls) {
|
||||
HINTERNET hConnect = InternetOpenUrlA(
|
||||
hInternet, url.c_str(), NULL, 0,
|
||||
@@ -225,19 +225,19 @@ public:
|
||||
);
|
||||
|
||||
if (!hConnect) {
|
||||
continue; // <EFBFBD><EFBFBD>ǰԴʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
continue; // 当前源失败,尝试下一个
|
||||
}
|
||||
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
if (InternetReadFile(hConnect, buffer, sizeof(buffer) - 1, &bytesRead) && bytesRead > 0) {
|
||||
result.assign(buffer, bytesRead);
|
||||
|
||||
// ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD>Ϳո<EFBFBD>
|
||||
// 去除换行符和空格
|
||||
while (!result.empty() && (result.back() == '\n' || result.back() == '\r' || result.back() == ' '))
|
||||
result.pop_back();
|
||||
|
||||
InternetCloseHandle(hConnect);
|
||||
break; // <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
break; // 成功获取,停止尝试
|
||||
}
|
||||
|
||||
InternetCloseHandle(hConnect);
|
||||
|
||||
Reference in New Issue
Block a user