Files
Sun1602/Client/GameClient/Curlib.cpp
T
2022-10-26 12:25:11 +08:00

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;
}