C++Socket編程—Libcurl庫


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM