一 代码
#include <stdio.h>
#include <curl/curl.h>
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
res = curl_easy_perform(curl); // 执行
if (res != 0) {
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}
二 解析
2.1 原代码为c++代码,而C语言中是没有bool数据类型的,所以要在头部进行宏定义,添加以下代码:
#define true 0
#define false 1
typedef unsigned int bool;
注意:1 这里的bool是一个数据类型,所以要用typedef定义;而0,1是具体的数据,所以用#define 定义;
2 #define定义是不带分号的,而typedef结尾是要带分号的;
2.2报错解决方法一
保存退出后编译会出错
报错是链库问题,编译时要添加链库路径,用以下代码编译
gcc demo1.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
其中-I 和-L 什么作用呢?
(1) -I
可以向 gcc 的头文件搜索路径中添加新的目录。
(2) -L
如果使用了不在标准位置的库文件,那么可以通过 -L 选项向 gcc 的库文件搜索路径中添加新的目录。
此时,还不能运行成功,需要设置程序共享库位置:
export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/
2.2报错解决方法二
方法二相比方法一更加简单,所以推荐使用方法二
其实最简单的办法是:sudo apt install libssl-dev libcurl4 libcurl4-openssl-dev
再直接 gcc demo1.c -lcurl 即可。
三 结果查看
可通过 vi /tmp/get.html 和 vi /tmp/post.html 查看访问网址的原码