curl_easy_setopt(curl, XXX, xxx);
设置curl的相关内容功能
1.CURLOPT_URL
设置访问URL
2.CURLOPT_WRITEFUNCTION
设置回调函数,执行libcurl在接受到数据后用户想进行的操作,通常函数多做数据保存的功能,如处理下载文件。回调函数的原型size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
3.CURLOPT_WRITEDATA
CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源,说白了就是设定回调函数的第四个参数的数据类型。
4.CURLOPT_TIMEOUT
设置传输时间
libcurl 同时支持http,smtp,ftp,tftp,ssh,telnet等协议,ssl,rtsp 安全相关配置。
具体配置相关选项连接:
https://blog.csdn.net/xj9120/article/details/97250438
libcurl 打印数据头信息实例:
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
struct MemoryStruct {
char* memory;
size_t allsize;
};
static size_t WriteMemoryCallback(void* contents, size_t _size, size_t nmemb, void* userp)
{
size_t realsize = _size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct*)userp;
mem->memory = (char*)realloc(mem->memory, mem->allsize + realsize + 1);
if(mem->memory == NULL){
printf("realloc error...\n");
return 0;
}
memcpy(&(mem->memory[mem->allsize]), contents, realsize);
mem->allsize += realsize;
mem->memory[mem->allsize] = 0;
return realsize;
}
size_t write_data(char* buffer, size_t size, size_t items, void* outstream)
{
int written = fwrite(buffer, size, items, (FILE*)(outstream));
return written;
}
double get_download_size(char* url){
CURL* curl;
CURLcode res;
double size = 0.0;
int httpcode=0;
FILE* fd = fopen("./aaa.txt", "wb+");
char *type = (char*)malloc(32);
struct MemoryStruct chunk;
chunk.memory = (char*)malloc(1);
chunk.allsize = 0;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
//curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0); //不跳转
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 3000);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)fd);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*)&chunk);
res = curl_easy_perform(curl);
if(res != CURLE_OK){
fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
}
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
if(res != CURLE_OK || httpcode != 200 ){
fprintf(stdout, "httpcode error!\n");
}
//获得download数据的大小
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size);
if(res != CURLE_OK ){
fprintf(stdout, "httpcode xxxerror!\n");
}
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &type);
if(res != CURLE_OK ){
fprintf(stdout, "TYPE xxxerror!\n");
}
printf("type:\n%s\n", type);
printf("header:\n%s\n", chunk.memory);
fclose(fd);
free(chunk.memory);
curl_easy_cleanup(curl);
return size;
}
int main(int argc, char* argv[])
{
char url[] = "https://baidu.com";
double filesize = get_download_size(url);
printf("[%0.0lf] %s\n", filesize, url);
return 0;
}
参考文献
这是一篇初级使用写的比较细的文章
https://www.cnblogs.com/heluan/p/10177475.html