libcurl主要功能就是用不同的协议连接和沟通不同的服务器~也就是相当封装了的sockPHP 支持libcurl(允许你用不同的协议连接和沟通不同的服务器)。, libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证。
编译配置:
正常情况下,我们不需要强制配置curlib的编译方式(32位或64位),配置如下:
./configure --disable-shared --enable-static --without-libidn --without-ssl -without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps -disable-ipv6 (编译选项可自行配置)
make
make install
但是如果在64位编译机上编译的curlib库,在32位机器上使用为出现错误:
curlrules.h:143:41: error: size of array ‘curl_rule_01’ is negative [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; ^ curlrules.h:153:53: error: size of array ‘curl_rule_02’ is negative
[CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)];
此时,就需要强制使用32位方式进行编译,编译脚本改为如下:
CFLAGS=’-m32’ CPPFLAGS=’-m32’ ./configure --disable-shared --enable-static --without-libidn --without-ssl -without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps -disable-ipv6 (编译选项可自行配置)
make
make install
lubcurl的使用如下:
curlhttpclient.h
#ifndef _CURL_H #define _CURL_H
#include “curl/curl.h” #include <iostream> using namespace std;
class CUrlHttpClient { public:
CUrlHttpClient(){}
~CUrlHttpClient(){}
/*
功 能 Curl POST请求
参 数 strURL 输入参数,请求的Url地址,如:http://www.baidu.com
strParam 输入参数,Post请求参数,使用Json格式
strResponse 输出参数,返回的内容
retCode 输出参数,返回的状态码
返 回 值 HTTP请求状态码
*/
CURLcode Post(string strURl, string strParam, string & strResponse, long & retCode);
/*
功 能 CURL GET请求
参 数 strURL 输入参数,请求的Url地址,如:http://www.baidu.com
strResponse 输出参数,返回的内容
retCode 输出参数,返回的状态码
返 回 值 HTTP请求状态码
*/
CURLcode Get(const string & strUrl, string & strResponse, long & retCode);
/*
功 能 请求回复信息处理函数
参 数 pBuffer 服务器回复信息字符串
size 获取数据的单字节数【1】
count size的个数
pParam 预置的配置参数
返 回 值 服务器消息的字节数
说 明
pParam为在发送数据请求时配置的参数,通常是文件指针,或字符串地址
这里使用字符处,保存服务器返回数据
*/
static size_t onReqReply(void *pBuffer, size_t size, size_t count, void *pParam);
static int onDebug(CURL *pcurl, curl_infotype itype, char * pData, size_t size, void *);
private: static bool m_bDebug; public: static void SetDebug(bool bDebug); };
#endif
curlhttpclient.cpp
#include “curlhttpclient.h”
CURLcode CUrlHttpClient::Post(string strURl, string strParam, string &strResponse, long & retCode) { // 初始化 CURL 全局变量,并分配全局资源 curl_global_init(CURL_GLOBAL_ALL);
CURLcode returnCode;
/* 初始化CURL,并获取句柄 */
CURL * curl = curl_easy_init();
if(NULL == curl)
{
return returnCode;
}
if(m_bDebug)
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // 配置非0,表示输出调试信息
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, &onDebug); // 打印完整的调试信息
}
/* 配置URL */
curl_easy_setopt(curl, CURLOPT_URL, strURl.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1); // 配置非0,表示发送POST请求
/* 配置HTTP请求 header*/
curl_slist *headers = curl_slist_append(NULL, "Content-Type:application/json;charset=UTF-8");
headers = curl_slist_append(headers, "Accept:application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
/* POST请求信息配置 */
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strParam.c_str()); // 设置POST请求参数
curl_easy_setopt(curl, CURLOPT_HEADER, 0); // 配置为0,表示返回的内容里不包含http header
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onReqReply); // 配置返回数据时执行的回调函数,可对返回数据进行处理
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); // 设置传递给回调函数的第4个参数
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 2000);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
/* 执行POST请求,并获取返回值*/
returnCode = curl_easy_perform(curl);
/* 获取状态码 */
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retCode);
curl_slist_free_all(headers);
/* 释放资源 */
curl_easy_cleanup(curl);
/* 释放全局资源 */
curl_global_cleanup();
return returnCode;
}
CURLcode CUrlHttpClient::Get(const string & strUrl, string & strResponse, long & retCode) { // 初始化 CURL 全局变量,并分配全局资源 curl_global_init(CURL_GLOBAL_ALL);
CURLcode returnCode;
/* 初始化CURL,并获取句柄 */
CURL * curl = curl_easy_init();
if(NULL == curl)
{
return returnCode;
}
if(m_bDebug)
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // 配置非0,表示输出调试信息
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, onDebug); // 打印完整的调试信息
}
/* 配置URL */
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onReqReply); // 配置返回数据时执行的回调函数,可对返回数据进行处理
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); // 设置传递给回调函数的第4个参数
/**
* 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。
* 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。
*/
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
/* 执行POST请求,并获取返回值*/
returnCode = curl_easy_perform(curl);
/* 获取状态码 */
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retCode);
/* 释放资源 */
curl_easy_cleanup(curl);
/* 释放全局资源 */
curl_global_cleanup();
return returnCode;
}
size_t CUrlHttpClient::onReqReply(void pBuffer, size_t size, size_t count, void lpVoid)
{
string str = dynamic_cast<string>((string *)lpVoid);
if( NULL == str || NULL == pBuffer )
{
return -1;
}
char* pData = (char*)pBuffer;
cout << "[" << pBuffer << ']';
str->append(pData, size * count);
return size * count;
}
int CUrlHttpClient::onDebug(CURL *pcurl, curl_infotype itype, char * pData, size_t size, void *)
{
if(itype == CURLINFO_TEXT)
{
cout << “[TEXT]:” << pData;
}
else if(itype == CURLINFO_HEADER_IN)
{
cout << “[HEADER_IN]:” << pData;
}
else if(itype == CURLINFO_HEADER_OUT)
{
cout << “[HEADER_OUT]:” << pData;
}
else if(itype == CURLINFO_DATA_IN)
{
cout << “[DATA_IN]:” << pData;
}
else if(itype == CURLINFO_DATA_OUT)
{
cout << “[DATA_OUT]:” << pData;
}
return 0;
}
bool CUrlHttpClient::m_bDebug = false;
void CUrlHttpClient::SetDebug(bool bDebug)
{
m_bDebug = bDebug;
}
使用:
s8 achUrl[TP_REC_FILE_LEN + 1];
string strResponse;
long retCode;
sprintf(achUrl, "http://%s/%s?ssoToken=%s", tSSOServerInfo.achSSOServer, SSO_LOGIN_OUT, strToken.c_str());
m_cUrlHttpClient.Post(achUrl, "", strResponse, retCode);
strResponse 是网络访问的返回内容,retCode是网络请求返回码