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>
|
||||
std::string getPublicIP() {
|
||||
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) {
|
||||
Mprintf("getPublicIP failed cost %d ms.\n", clock() - t);
|
||||
Mprintf("InternetOpen failed. cost %d ms.\n", clock() - t);
|
||||
return "";
|
||||
}
|
||||
|
||||
hConnect = InternetOpenUrl(hInternet, "https://api.ipify.org", NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 0);
|
||||
// <20><><EFBFBD>ó<EFBFBD>ʱ (<28><><EFBFBD><EFBFBD>)
|
||||
DWORD timeout = 3000; // 3 <20><>
|
||||
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));
|
||||
|
||||
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) {
|
||||
InternetCloseHandle(hInternet);
|
||||
Mprintf("getPublicIP failed cost %d ms.\n", clock() - t);
|
||||
return "";
|
||||
continue; // <20><>ǰԴʧ<D4B4>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
}
|
||||
|
||||
InternetReadFile(hConnect, buffer, sizeof(buffer) - 1, &bytesRead);
|
||||
InternetCloseHandle(hConnect);
|
||||
InternetCloseHandle(hInternet);
|
||||
Mprintf("getPublicIP succeed cost %d ms.\n", clock() - t);
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
if (InternetReadFile(hConnect, buffer, sizeof(buffer) - 1, &bytesRead) && bytesRead > 0) {
|
||||
result.assign(buffer, bytesRead);
|
||||
|
||||
return std::string(buffer);
|
||||
// ȥ<><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);
|
||||
}
|
||||
|
||||
InternetCloseHandle(hInternet);
|
||||
|
||||
Mprintf("getPublicIP %s cost %d ms.\n", result.empty() ? "failed" : "succeed", clock() - t);
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user