Linux下使用libcurl(C语言)来实现http请求(数据保存至文件)(包括下载libcurl)
其它关于lincurl文章
01Linux下使用libcurl(C语言)来实现http请求(数据保存至文件)(包括下载libcurl)
02Linux下使用libcurl(C语言)来实现http请求(数据保存至内存)(这里可以让你深入了解realloc函数)
参考文章:
Linux下实现C语言的http请求实现
1 下载libcurl
Curl 的官网下载地址:http://curl.haxx.se/download/
Curl 的使用例子地址: https://curl.haxx.se/libcurl/c/example.html
1)下载到的压缩包为curl-7.59.0.tar.gz使用命令:
$wget http://curl.haxx.se/download/curl-7.59.0.tar.gz //可以去官网点击想要的版本链接,然后替换本版本即可
2)解压
$tar -zxvf curl-7.59.0.tar.gz
3)进入解压出的目录curl-7.59.0.
$cd curl-7.59.0
4)3.配置参数
sudo ./configure
5)编译
sudo make
sudo make install
6)检查安装
$curl --version
出现如下情况安装基本成功。
2 源码
功能是登录某个URL网站,通过GET请求将服务器网站返回的信息利用Linux下的读写文件函数write(与下面的注意的write不一样)写进新的文件当中。
注意:
1)libcurl库中,当服务器有数据返回了,将触发write_cb回调函数接收数据,例如下面的接收到数据后写进文件,并不是read_cb的回调,刚好与概念相反。这与其他库不同,例如lib_event。
2)若curl_easy_setopt(*handle, CURLOPT_WRITEFUNCTION, NULL)回调函数设置为NULL,libcurl将默认调用fread(在read_cb中)/fwrite(在wrirte_cb中)读写数据。
#include <stdio.h>
#include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
const char *userpwd = "xxxxxx";//登录名和密码需要自己的,我不能提供,形式为"域名:密码"
const char *requestUrl = "xxxxxx";//要登录的url
const char *saveDataFileName = "curldata.txt";//保存网站响应数据的文件
//回调函数,将接收到的数据保存到本地文件中,同时显示在控制台上。
//size的值始终为1,buf为返回数据的首地址,nmemb为返回数据的长度,userp为用户定义的变量
static size_t write_data(void *buf, size_t size, size_t nmemb, void *userp){
int *fd = (int*)userp;
//printf("size=%ld",size);//1
size_t realSize = size*nmemb;
size_t file_return_size = write(*fd, buf,realSize);
if (file_return_size <= 0 ){
return -1;
}
//size_t return_size = fwrite(buf, size, nmemb, fp);
printf("receive_data_nmemb: %ld, file_return_size: %ld\n", nmemb,file_return_size);
//必须返回实际写进文件的大小,否则將導致傳輸中止,会向库发出错误状态信号。
return file_return_size;
}
//Get请求(默认)
int http_client_init(CURL **handle, const char *url, void *userp){
if (!url) {
return -1;
}
//1 初始化libcurl,设置默认参数
CURLcode return_code;
return_code= curl_global_init(CURL_GLOBAL_ALL);
if (CURLE_OK != return_code) {
printf("curl_global_init failed.\n");
return -1;
}
//2 获取easy handle
*handle = curl_easy_init();
if (!(*handle)) {
printf("curl_easy_init failed.\n");
return -1;
}
//3 通过CURLOPT_URL属性设置url
curl_easy_setopt(*handle,CURLOPT_URL, url);
//注册回调函数write_cb,回调函数将会在接收到数据的时候被调用
curl_easy_setopt(*handle, CURLOPT_WRITEFUNCTION, write_data);
//设置写数据的变量
if (userp) {
curl_easy_setopt(*handle, CURLOPT_WRITEDATA, userp);
}
//通过CURLOPT_USERPWD属性来设置用户名与密码。参数是”user:password “的字符串
curl_easy_setopt(*handle,CURLOPT_USERPWD, userpwd);
//4 使用curl_easy_perform执行上传数据
curl_easy_perform(*handle);
//5 任务执行结束使用curl_easy_cleanup把内存释放
curl_easy_cleanup(*handle);
//6 释放libcurl
curl_global_cleanup();
return 0;
}
int main(){
CURL *handle;
int fd;
fd = open(saveDataFileName , O_RDWR|O_CREAT);
if(fd == -1){
printf("open file failed.\n");
return -1;
}
//同样url网址为你要登录的网站,同样需要你自己弄,
int ret = http_client_init(&handle, requestUrl, (void*)&fd);
if(ret == -1){
printf("init client falied.\n");
close(fd);
return -1;
}
close(fd);
return 0;
}
3 执行gcc命令
gcc http_client.c -o http_client -l curl //-l curl代表链接库
发现出现以下错误:
出错原因:缺少libcurl-dev or libcurl-devel
解决:
CentOS:执行以下命令:
yum install libcurl-dev libcurl-devel
Ubuntu执行以下命令:
sudo apt-get install libcurl4-openssl-dev
注意:Ubuntu下不能输入CentOs的命令,否则会出现以下错误,主要是因为Ubuntu的管理工具是apt-get,而CentOS是yum。
成功执行将会在/user/include/软件包/curl下看到curl.h头文件。