一个更好用的http库 -- libcurl,送上简单示例代码
2014-07-28 22:03
399 查看
发现一个比ghttp更好的HTTP库, 它不仅支持http,也支持https.
struct MemoryStruct {
char *data;
size_t size;
};
static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data;
mem->data = realloc(mem->data, mem->size + realsize + 1);
if (mem->data) {
memcpy(&(mem->data[mem->size]), ptr, realsize);
mem->size += realsize;
mem->data[mem->size] = 0;
}
return realsize;
}
int load_net_file(const char *uri, long *httpCode, struct MemoryStruct *chunk)
{
CURL *curl = NULL;
CURLcode cret;
if(!uri || !chunk)
return -1;
curl = curl_easy_init();
if(!curl) {
fprintf(stderr, "Failed to init curl.");
return -1;
}
if(httpCode)
*httpCode = 0;
chunk->size = 0;
chunk->data = NULL;
curl_easy_setopt(curl, CURLOPT_URL, uri);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
/* NOTE: It must be set, otherwise it will crash when timeout */
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
#if 0
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
#endif
cret = curl_easy_perform(curl);
if(cret == CURLE_OK) {
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, httpCode);
curl_easy_cleanup(curl);
return 0;
}
/* Error case */
curl_easy_cleanup(curl);
if(cret == CURLE_URL_MALFORMAT) {
/* Handle it */
}
else if(cret == CURLE_OPERATION_TIMEDOUT) {
/* Handle it */
}
return -1;
}
struct MemoryStruct {
char *data;
size_t size;
};
static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data;
mem->data = realloc(mem->data, mem->size + realsize + 1);
if (mem->data) {
memcpy(&(mem->data[mem->size]), ptr, realsize);
mem->size += realsize;
mem->data[mem->size] = 0;
}
return realsize;
}
int load_net_file(const char *uri, long *httpCode, struct MemoryStruct *chunk)
{
CURL *curl = NULL;
CURLcode cret;
if(!uri || !chunk)
return -1;
curl = curl_easy_init();
if(!curl) {
fprintf(stderr, "Failed to init curl.");
return -1;
}
if(httpCode)
*httpCode = 0;
chunk->size = 0;
chunk->data = NULL;
curl_easy_setopt(curl, CURLOPT_URL, uri);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
/* NOTE: It must be set, otherwise it will crash when timeout */
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
#if 0
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
#endif
cret = curl_easy_perform(curl);
if(cret == CURLE_OK) {
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, httpCode);
curl_easy_cleanup(curl);
return 0;
}
/* Error case */
curl_easy_cleanup(curl);
if(cret == CURLE_URL_MALFORMAT) {
/* Handle it */
}
else if(cret == CURLE_OPERATION_TIMEDOUT) {
/* Handle it */
}
return -1;
}
相关文章推荐
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载)
- 用opengl编写一个简单的画图软件示例代码
- 一个非常简单的着色器示例代码
- java实现一个简单的网络爬虫代码示例
- Notification的一个简单应用代码示例
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载)
- 一个创建子进程的简单示例代码
- Linux平台:一个简单的TCP6 server的示例代码(socket)
- 深入浅出学习Struts1框架(一):一个简单mvc模式代码示例开始
- 用java的spring实现一个简单的IOC容器示例代码
- 一个最简单的IIS日志导入示例(含代码)
- 一个简单的JS时间控件示例代码(JS时分秒时间控件)
- 深入浅出学习Struts1框架(一):一个简单mvc模式代码示例开始
- 【代码示例】 一个简单的Java死锁
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载) [zhuan :D]
- 深入浅出学习Struts框架(一):一个简单mvc模式代码示例开始
- Asp.net 在网页编写C#代码示例-- 一个简单的web MsSql 命令执行环境
- 代码函数从零开始学习OpenCL开发(二)一个最简单的示例与简单性能分析
- 一个简单的ALSA示例代码
- 深入浅出学习Struts1框架:一个简单mvc模式代码示例开始