学了C语言,如何利用cURL写一个程序验证某个网址的有效性?

时间:2022-03-06 11:56:02

《C程序设计伴侣》以及这几篇关于cURL的文章中,我们介绍了如何利用cURL写一个下载程序,从网络下载文件。可是当我们在用这个程序下载文件时,又遇到了新问题:如果这个网址是无效的,那么我们的下载会失败,这就意味着我们在进行下载之前,需要对这个文件的网址的有效性进行验证。另外一个需要对网址进行验证的场景是,在C++11 FAQ中文版中有很多链接,因为一些后期的维护,其中的有些链接可能会失效,这就要求我们对其中的链接的有效性进行检查验证,及时地发现失效链接并进行维护。 以上这些场景下,都要求我们对网址(URL)的有效性进行验证,那么这一工作如何进行呢? 难道将需要验证的网址一个个复制到浏览器中试试看? 如果我们没有用《C程序设计伴侣》学过C语言,我们可以这样做,只是麻烦了一点,如果网址比较少还可以,如果是想验证C++11 FAQ中文版中的所有链接,恐怕就只有手抽筋的份了。 幸运的是,我们学了C语言,知道了如何利用cURL函数库来编写程序,让程序来帮我们完成这些繁杂而有规律的工作。 在学了C语言,如何利用CURL写一个下载程序?——用nmake编译CURL并安装这篇文章中,我们对cURL做了一个简单的介绍,它是一个可以用来处理各种网络事务的函数库,可以用来下载文件,自然也可以用来验证某个网址的有效性。在cURL函数库中,提供了一个curl_easy_getinfo()函数,利用这个函数,我们可以获得一个CURL网络会话的HTTP状态代码,根据服务器返回的状态码,我们就可以判断这个网址是否有效了。 当我们用curl_easy_setopt()函数设置好一个CURL网络会话的参数(URL,请求内容,响应时间等)之后,就可以用curl_easy_perform()函数来执行这个会话,向服务器发起一个连接请求,服务器就会根据情况(所请求的文件是否存在等)做出响应,返回相应的状态码。比如,最常见的404状态码表示请求失败,请求所希望得到的资源未被在服务器上发现。而200就表示请求得到正确响应。换句话说,只要某个请求的状态码是200,就意味着这个网址是有效的,而如果是其他数值,就意味着这个网址有点问题了。更多状态码的意义,可以参考*上的介绍。 按照上面的思路,利用cURL函数库,我们可以将这个程序实现如下:

// checkurl.c 验证URL的有效性
#include <curl/curl.h>
#include <stdio.h>
#include <stdbool.h> // 为了避免屏幕输出而定义的空的写数据函数
// 不写入任何数据,只是返回应该写入的数据的字节数
// 假装已经成功写入了这么多数据
size_t processdata(void *buffer, size_t size, size_t nmemb, void *user_p)
{
return nmemb;
} bool checkurl(char* url)
{
// 获得一个CURL会话,进行网络操作
CURL* handle = curl_easy_init();
if(NULL != handle && NULL != url)
{
// 设置本次会话的参数
// URL,就是我们要验证的网址
curl_easy_setopt(handle,CURLOPT_URL,url);
// 设置连接超时
curl_easy_setopt(handle,CURLOPT_CONNECTTIMEOUT,);
// 只是获取HTML的header
curl_easy_setopt(handle,CURLOPT_HEADER,true);
curl_easy_setopt(handle,CURLOPT_NOBODY,true);
// 设置最大重定向数为0,不允许页面重定向
curl_easy_setopt(handle,CURLOPT_MAXREDIRS,);
// 设置一个空的写入函数,屏蔽屏幕输出
curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION,&processdata); // 以上面设置的参数执行这个会话,向服务器发起请求
curl_easy_perform(handle);
// 获取HTTP的状态代码
// 根据代码判断网址是否有效
int retcode = ;
curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE , &retcode);
bool res = false;
// 如果HTTP反应代码为200,表示网址有效
if( == retcode)
{
res = true;
}
// 执行会话的清理工作
curl_easy_cleanup(handle); return res;
}
else // 无法验证
{
return false;
}
} int main(int argc,char* argv[])
{
// 检查参数
if( != argc )
{
puts("arguments error. e.g. checkurl www.blogger.com");
return -;
} // cURL的全局初始化
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
if(CURLE_OK != res)
{
puts("error: cannot init cURL");
return -;
}
// 验证网址的有效性
bool available = checkurl(argv[]); // 进行cURL的全局清理工作
curl_global_cleanup(); // 输出验证结果
if(available)
{
printf("%s works fine.",argv[]);
}
else
{
printf("%s seems to be unavailable.",argv[]);
} return ;
}

按照我们在学了C语言,如何利用cURL写一个下载程序?——在MinGW环境下实现中介绍的方法,我们可以用如下的方式编译和使用这个网址验证程序:

F:\code>gcc checkurl.c -lcurldll -o checkurl.exe

F:\code>checkurl.exe chenlq.net chenlq.net works fine. F:\code>checkurl.exe www.blogger.com www.blogger.com seems to be unavailable. F:\code>

这下,我们对哪些网站(chenlq.net)可以访问,哪些网站(www.blogger.com)打不开,就可以轻松验证了。有了这个程序,要想验证大量的网址也不是一件难事,这真的是学好C语言,走遍天下都不难

转自:http://www.howzhi.com/course/3387/lesson/43375

学了C语言,如何利用cURL写一个程序验证某个网址的有效性?的更多相关文章

  1. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  2. Scheme语言实例入门--怎样写一个&OpenCurlyDoubleQuote;新型冠状病毒感染风险检测程序”

    小学生都能用的编程语言 2020的春季中小学受疫情影响,一直还没有开学,孩子宅在家说想做一个学校要求的研究项目,我就说你做一个怎么样通过编程来学习数学的小项目吧,用最简单的计算机语言来解决小学数学问题 ...

  3. 利用 Python 写一个颜值测试小工具

    我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...

  4. 一道C语言面试题:写一个宏,将16位的整数转为Big Endian

    题目:输入16位整数x,如0x1234,将其转为Big Endian格式再输出,此例为输出 0x3412 来源:某500强企业面试题目 思路:将x左移8位得到a,将x右移8位得到b,a+b即为所得 / ...

  5. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  6. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  7. 利用epoll写一个&quot&semi;迷你&quot&semi;的网络事件库

    epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...

  8. python利用socket写一个文件上传

    1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中 2.代码: #模拟服务端 import subprocess import os import sock ...

  9. 利用Scrollow写一个下拉刷新

    利用scrollView滑动的2个监听方法实现 //滑动结束时候 出发的方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView ...

随机推荐

  1. nginx 在ubuntu 上的启动,停止,重启

    vi 显示行号 :set num 在开始玩nginx之前,得先安装nginx,可以参考 <ubuntu15.10_x64 安装 nginx>   启动 sudo /usr/local/ng ...

  2. hadoop2&period;7&period;1安装

    Hadoop2.7.1安装与配置 http://www.oschina.net/question/117352_247251 http://www.cnblogs.com/wayne1017/arch ...

  3. Android学习笔记(十一)——从意图返回结果

    从意图返回结果 startActivity()方法调用还有一个活动,但并没有返回结果给当前活动.此时如想从一个活动中回传数据,就要使用startActivityForResult()方法. 点此获取完 ...

  4. &lbrack;原创作品&rsqb; 对获取多层json值的封装

    今天篇头不废话了,交流加群:164858883 在我们接收后端返回的json数据的时候,在数据缺失的时候,如果直接接收会导致致命错误的发生.可能有些同学会说通常都会有,不用判断直接获取也行.之前我也是 ...

  5. Arduino 入门程序示例之一个 LED&lpar;2015-06-11&rpar;

    前言 答应了群主写一些示例程序,一直拖延拖延拖延唉.主要还是害怕在各大高手面前班门弄斧……(这也算是给拖延症找一个美好的理由吧),这几天终于下决心要写出来了,各位高手拍砖敬请轻拍啊. 示例程序 首先是 ...

  6. 如何使用linq操作datatable进行分组

    使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...

  7. tmux使用&lpar;程序员适用&rpar;

    原文:http://jack-boy.iteye.com/blog/1586908 tmux基本使用     tmux是一个优秀的终端复用软件,即使非正常掉线,也能保证当前的任务运行,这一点对于远程S ...

  8. vue跨域解决方法

    针对不在同一服务器,很可能出现跨域问题,解决方法 注意:修改了配置文件,需要重启才能生效

  9. HTML图片热区map area的用法

    <area>标记主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面.其基本语法结构如下: &lt ...

  10. Robots&period;txt 编写

    搜索引擎Robots协议,是放置在网站根目录下robots.txt文本文件,在文件中可以设定搜索引擎蜘蛛爬行规则.设置搜索引擎蜘蛛Spider抓取内容规则.下面Seoer惜缘举例robots写法规则与 ...