#include <iostream> #include <algorithm> #include <string> #include <cstdlib> #include <windows.h> #include <winhttp.h> #include <regex> #pragma comment(lib, "winhttp.lib") using namespace std; int main(int argc, char* argv[]) { DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; //1. 初始化一个WinHTTP-session句柄,参数1为此句柄的名称 hSession = WinHttpOpen(L"GetIP", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); // 通过上述句柄连接到服务器 需要指定服务器的IP和端口号,如果连接成功 返回的hConnect句柄不为NULL if (hSession) hConnect = WinHttpConnect(hSession, L"myip.ipip.net", INTERNET_DEFAULT_HTTP_PORT, 0); //默认是80 // 通过hConnect句柄创建一个hRequest句柄,用于发送数据与读取从服务器返回的数据。 // 参数2表示请求方式 这边我是用get 如果是post 要给出具体的地址 if (hConnect) hRequest = WinHttpOpenRequest(hConnect, L"GET", L"", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); // 向服务器发送post数据 if (hRequest) bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); // End the request. if (bResults) bResults = WinHttpReceiveResponse(hRequest, NULL); // Continue to verify data until there is nothing left. if (bResults) { do { // Verify available data. dwSize = 0; if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) printf("Error %u in WinHttpQueryDataAvailable. ", GetLastError()); if (dwSize == 0) break; // Allocate space for the buffer. pszOutBuffer = new char[dwSize + 1]; // Read the Data. ZeroMemory(pszOutBuffer, dwSize + 1); if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) printf("Error %u in WinHttpReadData. ", GetLastError()); else { printf("%s ", pszOutBuffer); char* pszBuffer = new char[dwSize + 1]; wchar_t* pszWideBuffer = new wchar_t[(dwSize + 1) * 2]; memset(pszWideBuffer, 0, (dwSize + 1) * 2); memset(pszBuffer, 0, dwSize + 1); MultiByteToWideChar(CP_UTF8, 0, pszOutBuffer, dwSize, pszWideBuffer, (dwSize + 1) * 2); //将unicode编码,转换为宽字节 WideCharToMultiByte(CP_ACP, 0, pszWideBuffer, wcslen(pszWideBuffer), pszBuffer, dwSize + 1, NULL, NULL); //将宽字节,转换为控制台编码 printf("%s ", pszBuffer); string info(pszBuffer); delete[] pszBuffer; delete[] pszWideBuffer; std::smatch result; std::regex pattern( "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"); //正则表达式 std::string::const_iterator iterStart = info.begin(); std::string::const_iterator iterEnd = info.end(); std::string temp = ""; if (regex_search(iterStart, iterEnd, result, pattern)) { temp = result[0]; } printf("%s", temp.c_str()); } // Free the memory allocated to the buffer. delete[] pszOutBuffer; } while (dwSize > 0); } // Report errors. if (!bResults) printf("Error %d has occurred. ", GetLastError()); // Close open handles. if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession); }