fix: #195 Client get public IP failed
This commit is contained in:
@@ -184,28 +184,64 @@ public:
|
|||||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>IP, <20><>ȡʧ<C8A1>ܷ<EFBFBD><DCB7>ؿ<EFBFBD>
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>IP, <20><>ȡʧ<C8A1>ܷ<EFBFBD><DCB7>ؿ<EFBFBD>
|
||||||
std::string getPublicIP() {
|
std::string getPublicIP() {
|
||||||
clock_t t = clock();
|
clock_t t = clock();
|
||||||
HINTERNET hInternet, hConnect;
|
|
||||||
DWORD bytesRead;
|
|
||||||
char buffer[1024] = { 0 };
|
|
||||||
|
|
||||||
hInternet = InternetOpen("Mozilla/5.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ѯԴ
|
||||||
|
static const std::vector<std::string> urls = {
|
||||||
|
"https://checkip.amazonaws.com", // ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
"https://api.ipify.org", // <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
|
||||||
|
"https://ipinfo.io/ip", // <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>
|
||||||
|
"https://icanhazip.com", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
"https://ifconfig.me/ip" // ĩλ<C4A9><CEBB><EFBFBD><EFBFBD>
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD> WinINet <20>Ự
|
||||||
|
HINTERNET hInternet = InternetOpenA("Mozilla/5.0", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
||||||
if (!hInternet) {
|
if (!hInternet) {
|
||||||
Mprintf("getPublicIP failed cost %d ms.\n", clock() - t);
|
Mprintf("InternetOpen failed. cost %d ms.\n", clock() - t);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
hConnect = InternetOpenUrl(hInternet, "https://api.ipify.org", NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 0);
|
// <20><><EFBFBD>ó<EFBFBD>ʱ (<28><><EFBFBD><EFBFBD>)
|
||||||
if (!hConnect) {
|
DWORD timeout = 3000; // 3 <20><>
|
||||||
InternetCloseHandle(hInternet);
|
InternetSetOptionA(hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &timeout, sizeof(timeout));
|
||||||
Mprintf("getPublicIP failed cost %d ms.\n", clock() - t);
|
InternetSetOptionA(hInternet, INTERNET_OPTION_SEND_TIMEOUT, &timeout, sizeof(timeout));
|
||||||
return "";
|
InternetSetOptionA(hInternet, INTERNET_OPTION_RECEIVE_TIMEOUT, &timeout, sizeof(timeout));
|
||||||
|
|
||||||
|
std::string result;
|
||||||
|
char buffer[2048];
|
||||||
|
DWORD bytesRead = 0;
|
||||||
|
|
||||||
|
// <20><>ѯ<EFBFBD><D1AF>ͬ IP <20><>ѯԴ
|
||||||
|
for (const auto& url : urls) {
|
||||||
|
HINTERNET hConnect = InternetOpenUrlA(
|
||||||
|
hInternet, url.c_str(), NULL, 0,
|
||||||
|
INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE | INTERNET_FLAG_NO_CACHE_WRITE,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!hConnect) {
|
||||||
|
continue; // <20><>ǰԴʧ<D4B4>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(buffer, 0, sizeof(buffer));
|
||||||
|
if (InternetReadFile(hConnect, buffer, sizeof(buffer) - 1, &bytesRead) && bytesRead > 0) {
|
||||||
|
result.assign(buffer, bytesRead);
|
||||||
|
|
||||||
|
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>Ϳո<CDBF>
|
||||||
|
while (!result.empty() && (result.back() == '\n' || result.back() == '\r' || result.back() == ' '))
|
||||||
|
result.pop_back();
|
||||||
|
|
||||||
|
InternetCloseHandle(hConnect);
|
||||||
|
break; // <20>ɹ<EFBFBD><C9B9><EFBFBD>ȡ<EFBFBD><C8A1>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
|
||||||
|
}
|
||||||
|
|
||||||
|
InternetCloseHandle(hConnect);
|
||||||
}
|
}
|
||||||
|
|
||||||
InternetReadFile(hConnect, buffer, sizeof(buffer) - 1, &bytesRead);
|
|
||||||
InternetCloseHandle(hConnect);
|
|
||||||
InternetCloseHandle(hInternet);
|
InternetCloseHandle(hInternet);
|
||||||
Mprintf("getPublicIP succeed cost %d ms.\n", clock() - t);
|
|
||||||
|
|
||||||
return std::string(buffer);
|
Mprintf("getPublicIP %s cost %d ms.\n", result.empty() ? "failed" : "succeed", clock() - t);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user