#include "SunClientPrecompiledHeader.h" #include "Curlib.h" CCurlib::CCurlib(void): mLibraryModule(0), mCurl(0), mExit(false) { } CCurlib::~CCurlib(void) { Release(); } bool CCurlib::Initialize() { Release(); mLibraryModule = LoadLibrary(_T("libcurl.dll")); if (!mLibraryModule) { return false; } { typedef void(__cdecl *Function)(long); Function curl_global_init = (Function)GetProcAddress(mLibraryModule, "curl_global_init"); if (!curl_global_init) { return false; } curl_global_init(CURL_GLOBAL_ALL); } return true; } void CCurlib::Release() { if (!mLibraryModule) { return; } { typedef void(__cdecl *Function)(); Function function = (Function)GetProcAddress(mLibraryModule, "curl_global_cleanup"); if (!function) { return; } function(); } FreeLibrary(mLibraryModule); mLibraryModule = 0; mCurl = 0; } int CCurlib::WriteToMemory(void* ptr, size_t size, size_t nmemb, void* data) { if (!data) { return 0; } size_t realsize = size * nmemb; struct DataStruct *RetData = (struct DataStruct *)data; RetData->Data = (char *)realloc(RetData->Data, RetData->size + realsize + 1); if (RetData->Data) { memcpy(&(RetData->Data[RetData->size]), ptr, realsize); RetData->size += realsize; RetData->Data[RetData->size] = 0; } return realsize; } string CCurlib::Download(const string& path) { //CCurlib& instance = GetInstance(); //CURL*& curl = instance.mCurl; //HMODULE libraryModule = instance.mLibraryModule; DataStruct DownLoadData; //curl_easy_init { typedef CURL* (__cdecl *Function)(); Function function = (Function)GetProcAddress(mLibraryModule, "curl_easy_init"); if (!function) { return ""; } mCurl = function(); } //curl_easy_setopt { typedef void(__cdecl *Function)(CURL*, CURLoption, ...); Function function = (Function)GetProcAddress(mLibraryModule, "curl_easy_setopt"); if (!function) { return ""; } function(mCurl, CURLOPT_URL, const_cast(path.c_str())); function(mCurl, CURLOPT_WRITEDATA, (void*)&DownLoadData); function(mCurl, CURLOPT_WRITEFUNCTION, WriteToMemory); function(mCurl, CURLOPT_FOLLOWLOCATION, 1); //function(mCurl, CURLOPT_CONNECTTIMEOUT_MS, 20000L); //function(mCurl, CURLOPT_TIMEOUT_MS, 20000); //function(mCurl, CURLOPT_NOSIGNAL, 3); } //curl_easy_perform { typedef CURLcode(__cdecl *Function)(CURL*); Function fucntion = (Function)GetProcAddress(mLibraryModule, "curl_easy_perform"); if (!fucntion) { return ""; } const CURLcode result = fucntion(mCurl); } //curl_easy_getinfo long retCode = 0; { typedef CURLcode(__cdecl *Function)(CURL*,CURLINFO,...); Function fucntion = (Function)GetProcAddress(mLibraryModule, "curl_easy_getinfo"); if (!fucntion) { return ""; } fucntion(mCurl, CURLINFO_RESPONSE_CODE, &retCode); } //curl_easy_cleanup { typedef void(__cdecl *Function)(CURL *); Function fucntion = (Function)GetProcAddress(mLibraryModule, "curl_easy_cleanup"); if (!fucntion) { return ""; } fucntion(mCurl); } return string(DownLoadData.Data); } std::string CCurlib::GetIP() { CURLcode res = curl_global_init(CURL_GLOBAL_ALL); if (CURLE_OK != res) { return ""; } CURL *pCurl; pCurl = curl_easy_init(); if (NULL == pCurl) { return ""; } curl_slist *pList = NULL; pList = curl_slist_append(pList, "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); pList = curl_slist_append(pList, "Accept-Language:zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"); pList = curl_slist_append(pList, "Accept-Encoding: gzip, deflate, br"); pList = curl_slist_append(pList, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.53"); curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pList); curl_easy_setopt(pCurl, CURLOPT_URL, "http://www.yuxigongzuoshi.com:5000/Game/GetUserIP"); curl_easy_setopt(pCurl, CURLOPT_HEADER, 0L); curl_easy_setopt(pCurl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(pCurl, CURLOPT_NOSIGNAL, 1L); DataStruct DownLoadData; curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &DownLoadData); curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, WriteToMemory); curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 2L); curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 60L); curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 10L); res = curl_easy_perform(pCurl); long res_code = 0; res = curl_easy_getinfo(pCurl, CURLINFO_RESPONSE_CODE, &res_code); curl_slist_free_all(pList); curl_easy_cleanup(pCurl); curl_global_cleanup(); return DownLoadData.Data; }