一、LibCurl基本編程框架
libcurl是一個跨平台的網絡協議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協議。libcurl同樣支持HTTPS證書授權,HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認證.
win32版的libcurl下載地址:http://curl.freeby.pctools.cl/download/libcurl-7.18.0-win32-msvc.zip
代碼示例:調用libcurl模擬發送http包,並獲取位置
#include <iostream> #include "curl/curl.h" #include <string> #pragma comment(lib, "libcurl.lib") using namespace std; const char* UTF8_To_GBK(const char* source, char* pcDes); string strUtf8; size_t WriteCallback(char* ptr, size_t size, size_t nmemb, void* userdata) { //printf(ptr); strUtf8 += ptr; return size * nmemb; //處理了所有的數據 } //初始化庫,進程生命周期只調用一次 curl_global_init(CURL_GLOBAL_ALL); /* 發送請求 */ //創建請求的句柄 CURL* handle = curl_easy_init(); //設置url CURLcode nRetCode=curl_easy_setopt(handle, CURLOPT_URL, "http://ip.tool.chinaz.com/"); //設置代理,是fidder可以抓到包 nRetCode = curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); //設置處理響應包的回調函數 nRetCode=curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, WriteCallback); //設置為fidder的代理地址 nRetCode = curl_easy_setopt(handle, CURLOPT_PROXY, "127.0.0.1:8888"); //為請求添加頭部 curl_slist* chunk = NULL; chunk = curl_slist_append(chunk, "Host: ip.tool.chinaz.com"); chunk = curl_slist_append(chunk, "User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko / 20100101 Firefox / 75.0"); chunk = curl_slist_append(chunk, "Accept : text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, */*;q=0.8"); chunk = curl_slist_append(chunk, "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); //chunk = curl_slist_append(chunk, "Accept-Encoding: gzip, deflate");//免解壓縮 chunk = curl_slist_append(chunk, "Connection: keep-alive"); chunk = curl_slist_append(chunk, "Upgrade-Insecure-Requests: 1"); curl_easy_setopt(handle, CURLOPT_HTTPHEADER, chunk); //發送請求 nRetCode = curl_easy_perform(handle); //處理數據 char* pBuff = new char[strUtf8.size()]; UTF8_To_GBK(strUtf8.c_str(), pBuff); //printf(pBuff); string strGbk = pBuff; delete[] pBuff; //正則查找位置 size_t nOff = strGbk.find("來自"); size_t nOffBegin = strGbk.find("<dd>", nOff); size_t nOffEnd = strGbk.find("<a href", nOffBegin + 4); string strLocation = strGbk.substr(nOffBegin + 4, nOffEnd - (nOffBegin + 4)); printf(strLocation.c_str()); //反初始化,進程生命周期只調用一次 curl_global_cleanup; return 0; } const char* UTF8_To_GBK(const char* source, char* pcDes) { enum { GB2312 = 936 }; //unsigned long len; int len = -1; len = ::MultiByteToWideChar(CP_UTF8, NULL, source, -1, NULL, NULL); if (len == 0) return NULL; wchar_t* wide_char_buffer = new wchar_t[len]; ::MultiByteToWideChar(CP_UTF8, NULL, source, -1, wide_char_buffer, len); len = ::WideCharToMultiByte(GB2312, NULL, wide_char_buffer, -1, NULL, NULL, NULL, NULL); if (len == 0) { delete[] wide_char_buffer; return NULL; } char* multi_byte_buffer = new char[len]; ::WideCharToMultiByte(GB2312, NULL, wide_char_buffer, -1, multi_byte_buffer, len, NULL, NULL); strcpy(pcDes, multi_byte_buffer); //std::string dest(multi_byte_buffer); delete[] multi_byte_buffer; delete[] wide_char_buffer; return pcDes; }