Linux网络编程开发之C语言url库的使用
一、libcurl库简介:
libcurl理解为lib-c-url,也就是C语言写的url库。URL码是应用层网络编程的基础:
-
有ftp协议的URL码
-
有dict协议的URL码
-
有http协议的URL码
-
有https协议的URL码
-
有telnet协议的URL码
-
有gopher协议的URL码
举个例子:
https://www.example.com/path/to/resource?param1=value1m2=value2#section1这个就是https协议的URL码;把这串字符码作为参数传递给libcurl库的函数。libcurl库的函数会把https://解析为默认端口port:443;再把www.example.com这个域名通过DNS域名解析器解析得到IP地址;有了端口port和IP地址->libcurl库就会为https建立TCP连接;然后把https://…这串字符码通过已经建立好的TCP连接发送到目标服务器。
libcurl只是负责构造各种协议的URL码,并通过TCP连接把URL码发送到目标服务器。服务器会通过这个TCP连接把响应的URL码返回给libcurl库函数;libcurl无法处理具体的响应URL码。我们需要把服务器响应的URL码拷贝到应用程序交给具体的处理库(如http库)
下面是图解:
二、libcurl库获取、编译、安装(几乎所有开源库的使用都是这个套路):
2.1获取:下载libcurl库压缩包,放到Ubuntu机子
2.2编译:
2.2.1:解压压缩包tar vxf curl-7.71.1.tar.bz2
2.2.2:配置./config,默认把库安装到/usr/lib或者/usr/include并且使用默认gcc编译器(你也可以用./configure --prefix=$PWD/_install来指定你想要的安装路径,使用./configure --host=arm-gcc-xxx来指定交叉编译器),配置成功长下面这样:
2.2.3:编译make -j12采用-j12即开12个线程来执行编译;编译成功长下面这样:
2.2.4:安装sudo make install 安装成功长下面这样:
三、libcurl库编程调用:(愉快的调库环节)
3.1定义:定义一个CURL指针,调用curl_easy_init()函数创建url码实例,返回url码实例的指针用CURL指针承接;
3.2设置:调用curl_easy_setopt函数把HTTP类型,域名,返回值存放文件路径设置到url码实例;
3.3发送请求:把设置好的url码实例调用curl_easy_perform()函数送到libcurl库;libcurl库解析应用程序下发的url码实例得到端口(http端口为80),解析域名得到IP;然后通过端口+IP和目标服务器建立连接;然后把整串url码字符发送到服务器;这就是一次请求过程;
3.4示例代码:
// 编译:gcc demo.c -lcurl -o hello
// 运行:./hello
#include <stdio.h>
#include <curl/curl.h>
int getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return -1;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 指定http协议头
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 0;
}
}
int main(void)
{
getUrl("./get.html"); // 传入当前路径下的文件名,请求网页的结果会存放在get.html这个文件里
return 0;
}
四、这个libcurl库编程有毛用?
4.1这个世界是一个数字的世界,你在哪里,可以用一串数字代表你的坐标;你讲话的声调可以用0255来表示,多个调合成在一起可以发出音节,音节合成单字;单字组合在一起就可以成为一句话;你讲话的声音可以用0255来表示;红色色度可以用0255来表示、绿色色度可以用0255来表示、蓝色色度可以用0255来表示;三种原始色度可以合成这个世界上的任意颜色。有了一个像素点,把2138400个像素点就可以合成一张图片;所有一切都可以用数字来表示;那我们可以把数字拆成0255范围大小也就是一个字节;每个字节都有对应的字符(ASCII码表:数字<->字符);我们可以把一张图片拆成2138400个像素点,每个像素点拆成3种色度,每种色度一个字节,那么2138400个像素点就是2138400*3 =6415200个字节,对应6415200个字符;大约是6M,我们把这6M字符拼接在http头和域名后面:得到这串字符串https://www.example.com/path/to/6415200个字符;把这么一串字符串交给libcurl库,libcurl库把字符串发送到目标服务器,目标服务器拿到字符串可以解析得到一张图片;连着发图片就是动图,动图不就是视频了?
4.2这个世界的任意数据可以转化为一个个的字节字符,用libcurl库可以把代表数据的一个个的字节字符从一端通过网络发送到另一端;