01Linux下使用libcurl(C语言)来实现http请求(数据保存至文件)(包括下载libcurl)

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头文件。
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。 在 Linux 下,可以使用 libcurl 库来发送 HTTP 请求并获取响应。以下是一个简单的示例代码,用于发送 GET 请求并打印响应消息: ```c #include <stdio.h> #include <curl/curl.h> size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) { printf("%.*s", (int)(size * nmemb), ptr); return size * nmemb; } int main() { CURL *curl; CURLcode res; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); res = curl_easy_perform(curl); if (res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); } return 0; } ``` 这个程序中,我们首先初始化了一个 CURL 对象,然后设置了要请求的 URL,并打开了自动重定向选项,以便能够跟随重定向。接着,我们设置一个回调函数,用于处理响应消息,最后调用 `curl_easy_perform()` 函数来执行请求并获取响应。 回调函数 `write_callback()` 接收 4 个参数,分别是数据指针、数据块大小、数据块数量和一个用户数据指针。在这个函数中,我们只是简单地打印出了收到的数据。如果你需要对响应数据进行其他处理,可以在这个函数中进行。 注意,这个代码中没有做任何错误处理,实际使用时需要根据具体情况进行处理。另外,需要在编译时链接 libcurl 库,例如使用以下命令进行编译: ``` gcc -o example example.c -lcurl ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值