linux中级——libcurl库访问百度     DATE: 2024-04-29 01:07:14

linux中级——libcurl库访问百度


linux中级——libcurl库访问百度


libcurl简介:

libcurl是一个跨平台的网络协议库,支持http,问百 https, ftp, gopher, telnet, dict, file, 和ldap 协议  。libcurl同样支持HTTPS证书授权,库访HTTP POST,问百 HTTP PUT, FTP 上传, HTTP基本表单上传 ,代理,库访cookies,问百和用户认证。libcurl的库访官网 、库下载 。问百这种库使用的库访时候就像使用wiringPi库一样,编写完代码需要链接这个库 ,问百所以要先下载这个库 。库访

libcurl等第三方库的问百通用编译方法 :

linux中级——libcurl库访问百度

在这里插入图片描述

linux中级——libcurl库访问百度

在这里插入图片描述

调用libcurl库访问百度

调用libcurl库访问百度主页并将数据保存到文件中 :程序代码:

#include <stdio.h>n#include <curl/curl.h>nn#define true 1n#define false 0ntypedef unsigned int bool;nnbool getUrl(char *filename)n{ n CURL *curl;n CURLcode res;n FILE *fp;n if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储n return false;n struct curl_slist *headers = NULL;n headers = curl_slist_append(headers, "Accept: Agent-007");n curl = curl_easy_init(); // 初始化n if (curl)n { n //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理n curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头n curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");n curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件n curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件n res = curl_easy_perform(curl); // 执行n if (res != 0) { nn curl_slist_free_all(headers);n curl_easy_cleanup(curl);n }n fclose(fp);n return true;n }n}nbool postUrl(char *filename)n{ n CURL *curl;n CURLcode res;n FILE *fp;n if ((fp = fopen(filename, "w")) == NULL)n return false;n curl = curl_easy_init();n if (curl)n { n curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件n curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容n //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");n curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定urln curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);n res = curl_easy_perform(curl);n curl_easy_cleanup(curl);n }n fclose(fp);n return true;n}nint main(void)n{ n getUrl("/tmp/get.html");n postUrl("/tmp/post.html");n}n

大概解读代码 : 要用一个是getUrl ,一个是postUrl,用getpost两种方法来请求的一个网页 。 getUrl ,我们来看一下,是自己封装的这个函数,fopen这个函数去打开了一个文件 ,放在fp这个流里面。然后curl_easy_init去做初始化,去初始化我们的curl引擎 ,初始化成功以后curl_easy_setopt去设置curl相关的项 ,包括我们要访问的IP地址等等,还有一个CURLOPT_WRITEDATA 。访问成功数据返回以后呢会把数据流导入到这个filename这个文件里面 ,那filename文件是哪里呢 ?在/tmp/get.html。这文件如果没有的话,他这边fp = fopen(filename, "w")应该会创建啊,去回顾一下文件相关的操作 。然后将返回的 html主体数据输出到fp指向的文件 ,**百度的访问的所有结果往文件里面去写** ,然后curl_easy_perform执行就是在访问百度 ,如果res != 0 ,这个res不等于零是啥意思呢 ?我们去回顾一下之前提到的这个进行http请求以后的一个返回值,如果请求成功以后啊,我们去释放这相关的curl的这个句柄。并且关闭这个文件,return true;访问成功,这个是相关的步骤

通过以上设置然后再执行程序 :可以看到/tmp/get.html这个文件夹里面有从百度网页获取的html代码:

linux中级——libcurl库访问百度

libcurl库函数介绍 :

curl_global_init(long flags)函数 :

libcurl的使用(其实和socket编程时一样,都需要一定的步骤) :

调用curl_global_init()初始化libcurl,(就像初始化套接字)

调用curl_easy_init()函数得到 easy interface型指针(这个指针用来各种配置)

调用curl_easy_setopt()设置传输选项(通过调curl_easy_setopt这个函数来对指针进行各种配置 ,比如:请求的方式)

根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务

调用curl_easy_perform()函数进行访问请求

调用curl_easy_cleanup()释放内存

函数简介

CURLcode curl_global_init(long flags) 功能:初始化libcurl这个函数只能用一次 。(其实在调用curl_global_cleanup 函数后仍然可再用) 如果这个函数在curl_easy_init函数调用时还没调用 ,它将由libcurl库自动调用所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用 。

注意 :虽然libcurl是线程安全的 ,但curl_global_init是不能保证线程安全的 , 所以不要在每个线程中都调用curl_global_init ,应该将该函数的调用放在主线程中 。

参数 :flagsnCURL_GLOBAL_ALL //初始化所有的可能的调用 。nCURL_GLOBAL_SSL //初始化支持 安全套接字层 。nCURL_GLOBAL_WIN32 //初始化win32套接字库。nCURL_GLOBAL_NOTHING //没有额外的初始化。n

CURLcode curl_easy_setopt(CURL * handle, CURLoption option,parameter)函数:

这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.(这个函数有些像ioctl函数)

参数:

CURL类型的指针

各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)

parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数. CURLoption 这个参数的取值很多.具体的可以查看man手册.