日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libcurl使用样例

發布時間:2024/1/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libcurl使用样例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

libcurl被很多軟件廠商使用,libcurl提供了使用C或C++語言支持http訪問,所有常用于客戶端軟件

本例學習了libcurl的寫法,上代碼:

#pragma once

#ifndef __RESTCLIENTPOOL_H__
#define __RESTCLIENTPOOL_H__
#include "./libcurl-vc16-x86-release-dll-ipv6-sspi-schannel/include/curl/curl.h"

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <stdarg.h>
#include <string>
#include <vector>
#include <queue>
using namespace std;

typedef size_t(*callback_func)(void* ptr, size_t size, size_t nmemb, void* stream);

struct curl_data
{
? ? string* response;
? ? callback_func cb;

? ? curl_data(const char* pUrl, callback_func func)
? ? {
? ? ? ? response = new std::string(pUrl);
? ? ? ? cb = func;
? ? }
? ? ~curl_data()
? ? {
? ? ? ? delete response;
? ? }
};

class RestClientPool
{
public:
? ? RestClientPool(void);
? ? ~RestClientPool(void);

public:

? ? /**
? ? * @brief HTTP GET請求
? ? * @param strUrl 輸入參數,請求的Url地址,如:http://www.baidu.com
? ? * @param strResponse 輸出參數,返回的內容
? ? * @return 返回是否Post成功
? ? */
? ? int Get(callback_func cb, std::string * strResponse);


public:
? ? void SetDebug(bool bDebug);
?? ? int GlobleInit();//全局初始化,主程序調用一次
?? ?void GlobleFint();

? ? CURL* GetCurl();
? ? CURL* CreateCurl();
? ? void PutCurl(CURL* curl);
private:
? ? bool m_bDebug;

? ? queue<CURL* > m_VectCurl;
? ? vector< curl_slist*> m_VectSlist;
? ? HANDLE hMutex;
};

#endif

// curl_multi_test.cpp : 定義控制臺應用程序的入口點。
//

#include "RestClientPool.h"

// 唯一的應用程序

# ? ? ? pragma comment(lib, ?"libcurl-vc16-x86-release-dll-ipv6-sspi-schannel/lib/libcurl.lib")


RestClientPool::RestClientPool(void) :
?? ?m_bDebug(false)
{
?? ?GlobleInit();//全局初始化,主程序調用一次

?? ?hMutex = CreateMutex(NULL, FALSE, NULL);
}

RestClientPool::~RestClientPool(void)
{
?? ?for (curl_slist* p : m_VectSlist) {
?? ??? ?if (p != nullptr)
?? ??? ??? ?curl_slist_free_all(p);
?? ?}
?? ?m_VectSlist.clear();

?? ?if (m_VectCurl.size() > 0)
?? ?{
?? ??? ?CURL* curl = m_VectCurl.front();
?? ??? ?m_VectCurl.pop();
?? ??? ?while (curl != nullptr) {
?? ??? ??? ?curl_easy_cleanup(curl);
?? ??? ??? ?if (m_VectCurl.size() <= 0)
?? ??? ??? ??? ?break;
?? ??? ??? ?curl = m_VectCurl.front();
?? ??? ??? ?m_VectCurl.pop();
?? ??? ?}
?? ?}
?? ?CloseHandle(hMutex);

?? ?GlobleFint();
}

static int OnDebug(CURL*, curl_infotype itype, char* pData, size_t size, void*)
{
?? ?if (itype == CURLINFO_TEXT)
?? ?{
?? ??? ?//printf("[TEXT]%s\n", pData);
?? ?}
?? ?else if (itype == CURLINFO_HEADER_IN)
?? ?{
?? ??? ?printf("[HEADER_IN]%s\n", pData);
?? ?}
?? ?else if (itype == CURLINFO_HEADER_OUT)
?? ?{
?? ??? ?printf("[HEADER_OUT]%s\n", pData);
?? ?}
?? ?else if (itype == CURLINFO_DATA_IN)
?? ?{
?? ??? ?printf("[DATA_IN]%s\n", pData);
?? ?}
?? ?else if (itype == CURLINFO_DATA_OUT)
?? ?{
?? ??? ?printf("[DATA_OUT]%s\n", pData);
?? ?}
?? ?return 0;
}


CURL* RestClientPool::GetCurl()
{
?? ?CURL* curl = NULL;
?? ?WaitForSingleObject(hMutex, INFINITE);
?? ?if (m_VectCurl.size() > 0)
?? ?{

?? ??? ?curl = m_VectCurl.front();
?? ??? ?m_VectCurl.pop();

?? ?}
?? ?ReleaseMutex(hMutex);
?? ?if (curl == NULL)
?? ?{
?? ??? ?curl = CreateCurl();
?? ?}
?? ?return curl;
}

void RestClientPool::PutCurl(CURL* curl)
{
?? ?WaitForSingleObject(hMutex, INFINITE);

?? ?m_VectCurl.push(curl);
?? ?ReleaseMutex(hMutex);
}


CURL* RestClientPool::CreateCurl()
{
?? ?CURL* curl = curl_easy_init();
?? ?if (NULL == curl)
?? ?{
?? ??? ?return NULL;
?? ?}


?? ?curl_slist* list = nullptr;
?? ?list = curl_slist_append(list, "Accept: text/json");
?? ?//list = curl_slist_append(list, "Accept-Encoding: gzip");
?? ?list = curl_slist_append(list, "Accept-Language: zh-CN,zh;q=0.9");
?? ?list = curl_slist_append(list, "Content-Type: text/json");
?? ?list = curl_slist_append(list, "Host: localhost:80");
?? ?list = curl_slist_append(list, "Connection: Keep-Alive");
?? ?//list = curl_slist_append(list, "Cookie: em_hq_fls=js; qgqp_b_id=7473a399162f1995601a1fb59c4bd05f; ct=2ix0h5AQ4v538wkocKxPcY_ilboT2srS08hrjybizJ5Kc58v02kimh6AZe2Yz7Z4p_1KLU7-LIqeBaC2WyrERVzjx1K9g8RgMIs1vO-lBw9ao0KHJ_bvxJhQkdtJspPVs3fqpWLR-rGfdSEiB6055Aqg2ux3Ej_WVoLrW9EXhrU");
?? ?list = curl_slist_append(list, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36");

?? ?curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
?? ?if (m_bDebug)
?? ?{
?? ??? ?curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
?? ??? ?curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
?? ?}
?? ?//curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
?? ?curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);

?? ?/* enable TCP keep-alive for this transfer */
?? ?curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
?? ?/* keep-alive idle time to 120 seconds */
?? ?curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 300L);
?? ?/* interval time between keep-alive probes: 60 seconds */
?? ?curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 20L);
?? ?curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
?? ?/**
?? ?* 當多個線程都使用超時處理的時候,同時主線程中有sleep或是wait等操作。
?? ?* 如果不設置這個選項,libcurl將會發信號打斷這個wait從而導致程序退出。
?? ?*/
?? ?curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
?? ?curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 20);

?? ?m_VectSlist.push_back(list);

?? ?return curl;
}
void RestClientPool::SetDebug(bool bDebug)
{
?? ?m_bDebug = bDebug;
}

int RestClientPool::GlobleInit()//全局初始化,主程序調用一次
{
?? ?return curl_global_init(CURL_GLOBAL_ALL);
}
void RestClientPool::GlobleFint()
{
?? ?curl_global_cleanup();
}


int RestClientPool::Get(callback_func func, std::string* strResponse)
{
?? ?int res;
?? ?//CURL* curl = CurlMutiTreadMutex::GetInstance()->muti_curl_easy_init();
?? ?CURL* curl = GetCurl();
?? ?if (NULL == curl)
?? ?{
?? ??? ?return CURLE_FAILED_INIT;
?? ?}

?? ?curl_easy_setopt(curl, CURLOPT_URL, strResponse->c_str());
?? ?curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, func);
?? ?curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)strResponse);
?? ?res = curl_easy_perform(curl);
?? ?if (res != 0)
?? ?{
?? ??? ?printf("curl_easy_perform error %d\n", res);
?? ?}
?? ?PutCurl(curl);
?? ?return res;
}


bool ctrlhandler(DWORD fdwctrltype)
{
?? ?bool bRet = false;
?? ?switch (fdwctrltype)
?? ?{
?? ??? ?// handle the ctrl-c signal.
?? ?case CTRL_C_EVENT:
?? ??? ?printf("ctrl-c event\n\n");
?? ??? ?bRet = true;
?? ??? ?break;
?? ??? ?// ctrl-close: confirm that the user wants to exit.
?? ?case CTRL_CLOSE_EVENT:
?? ??? ?printf("ctrl-close event\n\n");
?? ??? ?bRet = true;
?? ??? ?break;
?? ??? ?// pass other signals to the next handler.
?? ?case CTRL_BREAK_EVENT:
?? ??? ?printf("ctrl-break event\n\n");
?? ??? ?bRet = false;
?? ??? ?break;
?? ?case CTRL_LOGOFF_EVENT:
?? ??? ?printf("ctrl-logoff event\n\n");
?? ??? ?bRet = false;
?? ??? ?break;
?? ?case CTRL_SHUTDOWN_EVENT:
?? ??? ?printf("ctrl-shutdown event\n\n");
?? ??? ?bRet = false;
?? ??? ?break;
?? ?default:
?? ??? ?break;;
?? ?}

?? ?return bRet;
}


?還有多線程并發的例子,歡迎到我的資源下載學習,徹底掌握libcurl

總結

以上是生活随笔為你收集整理的libcurl使用样例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。