如何制作网站导航栏,北京网站设计建设公司,海曙网站设计建设,万链网站做的怎么样?LibCurl是一个开源的免费的多协议数据传输开源库#xff0c;该框架具备跨平台性#xff0c;开源免费#xff0c;并提供了包括HTTP、FTP、SMTP、POP3等协议的功能#xff0c;使用libcurl可以方便地进行网络数据传输操作#xff0c;如发送HTTP请求、下载文件、发送电子邮件等…LibCurl是一个开源的免费的多协议数据传输开源库该框架具备跨平台性开源免费并提供了包括HTTP、FTP、SMTP、POP3等协议的功能使用libcurl可以方便地进行网络数据传输操作如发送HTTP请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中特别是涉及到数据传输的场景。
下载地址https://curl.haxx.se/download.html
首先读者需要自行下载该库如下笔者选择下载curl-8.0.1.zip这个源代码版本读者可找到如下页面并点击对应版本完成下载当下载好以后读者可自行将其解压缩到任意目录下。 当读者解压缩后可打开VS2013 开发人员命令提示并切换带该目录中的curl-8.0.1\winbuild目录通过执行如下两条命令即可分别实现编译静态库或动态库我们以静态库编译为主执行如下命令读者可自行等待一段时间。
动态库: nmake /f Makefile.vc modedll VC13 MACHINEx86 DEBUGno静态库: nmake / f Makefile.vc mode static VC 13 ENABLE_IDN no MACHINE x86 DEBUG no
这个库在编译通过后会自动生成文件到builds\libcurl-vc13-x86-release-static-ipv6-sspi-schannel目录内读者可自行打开该目录即可看到该目录内的头文件以及库目录文件如下图所示 读者可自行配置这个静态库通常只需要配置include和lib文件即可该库的使用很简单首先我们需要调用curl_easy_init()函数对CURL对象进行初始化接着通过调用curl_easy_setopt()并传入一个访问URL链接当访问成功后则可调用curl_easy_perform()函数得到访问结果这就是该库基本使用方法如下代码。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include iostream
#include curl/curl.h#pragma comment (lib,libcurl_a.lib)
#pragma comment (lib,wldap32.lib)
#pragma comment (lib,ws2_32.lib)
#pragma comment (lib,Crypt32.lib)using namespace std;int main(int argc, char *argv[])
{CURL *curl;CURLcode res;curl curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, https://www.lyshark.com);res curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout 返回状态: res std::endl;system(pause);return 0;
}运行上述代码读者可看到网站www.lyshark.com的源代码如下图所示 上述代码中的curl_easy_setopt()函数第二个参数可以使用多种类型的变量定义我们可以通过传入不同的常量来定义请求头中的参数例如当我们需要修改协议头时可以使用CURLOPT_HTTPHEADER常量并在其后第三个参数中传入该常量所对应的结构即可这个结构体定义有许多类型具体如下下表所示
常量名称描述CURLINFO_EFFECTIVE_URL最后一个有效的URL地址CURLINFO_HTTP_CODE最后一个收到的HTTP代码CURLINFO_FILETIME远程获取文档的时间如果无法获取则返回值为-1CURLINFO_TOTAL_TIME最后一次传输所消耗的时间CURLINFO_NAMELOOKUP_TIME名称解析所消耗的时间CURLINFO_CONNECT_TIME建立连接所消耗的时间CURLINFO_PRETRANSFER_TIME从建立连接到准备传输所使用的时间CURLINFO_STARTTRANSFER_TIME从建立连接到传输开始所使用的时间CURLINFO_REDIRECT_TIME在事务传输开始前重定向所使用的时间CURLINFO_SIZE_UPLOAD以字节为单位返回上传数据量的总值CURLINFO_SIZE_DOWNLOAD以字节为单位返回下载数据量的总值CURLINFO_SPEED_DOWNLOAD平均下载速度CURLINFO_SPEED_UPLOAD平均上传速度CURLINFO_HEADER_SIZEheader部分的大小CURLINFO_HEADER_OUT发送请求的字符串CURLINFO_REQUEST_SIZE在HTTP请求中有问题的请求的大小CURLINFO_SSL_VERIFYRESULT通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果CURLINFO_CONTENT_LENGTH_DOWNLOAD从Content-Length: field中读取的下载内容长度CURLINFO_CONTENT_LENGTH_UPLOAD上传内容大小的说明CURLINFO_CONTENT_TYPE下载内容的Content-Type:值NULL表示服务器没有发送有效的Content-Type:header
如下案例是一个简单的GET请求封装通过调用GetStatus()函数实现对特定页面发起请求的功能其中curl_slist_append()用于增加新的请求头数据在调用curl_easy_setopt()函数时分别传入了CURLOPT_HTTPHEADER设置请求头CURLOPT_WRITEFUNCTION设置回调CURLINFO_PRIMARY_IP获取目标IP地址CURLINFO_RESPONSE_CODE获取目标返回代码此处的write_data()函数直接返回0则表示屏蔽所有的页面输出内容。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include iostream
#include curl/curl.h#pragma comment (lib,libcurl_a.lib)
#pragma comment (lib,wldap32.lib)
#pragma comment (lib,ws2_32.lib)
#pragma comment (lib,Crypt32.lib)using namespace std;// 设置CURLOPT_WRITEFUNCTION回调函数,返回为空屏蔽输出
static size_t write_data(char *d, size_t n, size_t l, void *p)
{return 0;
}// 获取网站返回值
void GetStatus(char *UrlPage)
{CURLcode return_code;// 初始化模块return_code curl_global_init(CURL_GLOBAL_WIN32);if (CURLE_OK ! return_code){return;}// 初始化填充请求头struct curl_slist *headers NULL;headers curl_slist_append(headers, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0));headers curl_slist_append(headers, Referer: https://www.lyshark.com);// 初始化请求库CURL *easy_handle curl_easy_init();if (NULL ! easy_handle){// CURLOPT_HTTPHEADER 自定义设置请求头curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers);// CURLOPT_URL 自定义请求的网站curl_easy_setopt(easy_handle, CURLOPT_URL, UrlPage);// CURLOPT_WRITEFUNCTION 设置回调函数,屏蔽输出curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, write_data);// 执行CURL访问网站return_code curl_easy_perform(easy_handle);char *ipAddress { 0 };// CURLINFO_PRIMARY_IP 获取目标IP信息return_code curl_easy_getinfo(easy_handle, CURLINFO_PRIMARY_IP, ipAddress);if ((CURLE_OK return_code) ipAddress){std::cout 目标IP: ipAddress std::endl;}long retcode 0;// CURLINFO_RESPONSE_CODE 获取目标返回状态return_code curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE, retcode);if ((CURLE_OK return_code) retcode){std::cout 返回状态码: retcode std::endl;}}curl_easy_cleanup(easy_handle);curl_global_cleanup();
}int main(int argc, char *argv[])
{GetStatus(https://www.lyshark.com);system(pause);return 0;
}运行上述代码则可以获取到www.lyshark.com目标主机的IP地址以及页面返回状态如下图所示 当然该库同样支持POST请求方式在使用POST请求时我们可以通过CURLOPT_COOKIEFILE参数指定Cookie参数通过CURLOPT_POSTFIELDS指定POST的数据集而如果需要使用代理模式则可以通过CURLOPT_PROXY方式来指定代理地址
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include iostream
#include curl/curl.h#pragma comment (lib,libcurl_a.lib)
#pragma comment (lib,wldap32.lib)
#pragma comment (lib,ws2_32.lib)
#pragma comment (lib,Crypt32.lib)using namespace std;bool SendPost(char *Url, char *Cookie, char *PostVal)
{CURL *curl;CURLcode res;// 初始化库curl curl_easy_init();if (curl){// 设置请求头struct curl_slist *headers NULL;headers curl_slist_append(headers, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0));headers curl_slist_append(headers, Referer: https://www.lyshark.com);// 设置请求头curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 指定URLcurl_easy_setopt(curl, CURLOPT_URL, Url);// 指定cookie参数curl_easy_setopt(curl, CURLOPT_COOKIEFILE, Cookie);// 指定post内容curl_easy_setopt(curl, CURLOPT_POSTFIELDS, PostVal);// 是否代理// curl_easy_setopt(curl, CURLOPT_PROXY, 10.99.60.201:8080);res curl_easy_perform(curl);curl_easy_cleanup(curl);}return true;
}int main(int argc, char *argv[])
{// 传入网址 cookie 以及post参数SendPost(https://www.lyshark.com/post.php, 1e12sde342r2, logintypeuiduxieyanpswxxx86);system(pause);return 0;
}该函数的调用需要有一个POST结构才可测试此处由于我并没有指定接口所有返回了页面错误信息如下图所示 接着继续实现下载页面到本地的功能该功能实现的原理是利用write_data回调函数当页面数据被读入到内存时回调函数会被触发在该回调函数的内部通过调用fwrite函数将ptr指针中的数据保存本地实现这段代码如下所示
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include iostream
#include curl/curl.h#pragma comment (lib,libcurl_a.lib)
#pragma comment (lib,wldap32.lib)
#pragma comment (lib,ws2_32.lib)
#pragma comment (lib,Crypt32.lib)using namespace std;FILE *fp;size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{int written fwrite(ptr, size, nmemb, (FILE *)fp);return written;
}BOOL GetUrl(char *URL, char *FileName)
{CURL *curl;curl_global_init(CURL_GLOBAL_ALL);curl curl_easy_init();curl_easy_setopt(curl, CURLOPT_URL, URL);// 在屏幕打印请求连接过程和返回http数据curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);// 查找次数,防止查找太深curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);// 设置连接超时curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);// 接收数据时超时设置curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);if ((fp fopen(FileName, w)) NULL){curl_easy_cleanup(curl);return FALSE;}// CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_perform(curl);curl_easy_cleanup(curl);return TRUE;
}int main(int argc, char *argv[])
{// 下载网页到本地GetUrl(https://www.lyshark.com, ./lyshark.html);system(pause);return 0;
}当读者运行上述程序后即可将www.lyshark.com网站页面源码下载到本地当前目录下lyshark.html输出效果如下图所示 为了能解析参数我们还是需要将页面源代码读入到内存中要实现这个需求并不难首先我们定义一个std::string容器然后当有新数据产生时触发WriteCallback在该函数内我们直接将数据拷贝到一个内存指针中也就是存储到read_buffer内并将该缓冲区返回给调用者即可如下则是完整源代码。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include iostream
#include string
#include curl/curl.h#pragma comment (lib,libcurl_a.lib)
#pragma comment (lib,wldap32.lib)
#pragma comment (lib,ws2_32.lib)
#pragma comment (lib,Crypt32.lib)using namespace std;// 存储回调函数
size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{((std::string*)userp)-append((char*)contents, size * nmemb);return size * nmemb;
}// 获取数据并放入string中.
std::string GetUrlPageOfString(std::string url)
{std::string read_buffer;CURL *curl;curl_global_init(CURL_GLOBAL_ALL);curl curl_easy_init();if (curl){// 忽略证书检查curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);// 重定向curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);// URL路径curl_easy_setopt(curl, CURLOPT_URL, url);// 查找次数,防止查找太深curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);// 连接超时curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);// 接收数据时超时设置curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);// 写入回调函数curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, read_buffer);curl_easy_perform(curl);curl_easy_cleanup(curl);return read_buffer;}return None;
}int main(int argc, char *argv[])
{std::string urls GetUrlPageOfString(https://www.lyshark.com);std::cout 接收长度: urls.length() bytes std::endl;system(pause);return 0;
}如下图所示则是运行后输出内存数据长度当然我们也可以直接输出urls中的数据也就是网页的源代码 本文作者 王瑞 本文链接 https://www.lyshark.com/post/6aa9753b.html 版权声明 本博客所有文章除特别声明外均采用 BY-NC-SA 许可协议。转载请注明出处