216 lines
4.7 KiB
C++
216 lines
4.7 KiB
C++
#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<char*>(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;
|
|
} |