zoukankan      html  css  js  c++  java
  • 学了C语言,如何利用cURL写一个程序验证某个网址的有效性?

          在《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,5);
            // 只是获取HTML的header
            curl_easy_setopt(handle,CURLOPT_HEADER,true);
            curl_easy_setopt(handle,CURLOPT_NOBODY,true);
            // 设置最大重定向数为0,不允许页面重定向
            curl_easy_setopt(handle,CURLOPT_MAXREDIRS,0);
            // 设置一个空的写入函数,屏蔽屏幕输出
            curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION,&processdata);
             
            // 以上面设置的参数执行这个会话,向服务器发起请求
            curl_easy_perform(handle);
            // 获取HTTP的状态代码
            // 根据代码判断网址是否有效
            int retcode = 0;
            curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE , &retcode); 
            bool res = false;
            // 如果HTTP反应代码为200,表示网址有效
            if(200 == retcode)
            {
                res = true;
            }
            // 执行会话的清理工作 
            curl_easy_cleanup(handle);
     
            return res;
        }
        else // 无法验证
        {
            return false;
        }
    }
     
    int main(int argc,char* argv[])
    {
        // 检查参数
        if( 2 != argc )
        {
            puts("arguments error. e.g. checkurl www.blogger.com");
            return -1;
        }
     
        // cURL的全局初始化
        CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
        if(CURLE_OK != res)
        {
            puts("error: cannot init cURL");
            return -1;
        }
        // 验证网址的有效性
        bool available = checkurl(argv[1]);
        
        // 进行cURL的全局清理工作
        curl_global_cleanup();
        
        // 输出验证结果
        if(available)
        {
            printf("%s works fine.",argv[1]);
        }
        else
        {
            printf("%s seems to be unavailable.",argv[1]);
        }
     
        return 0;
    }

         按照我们在学了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

  • 相关阅读:
    申诉电信ADSL宽带限速
    回帖整理
    继续无题
    抛砖引玉,征集体会
    关于程序组织和组织技巧的学习
    周鸿祎行
    无题
    用此书为例讨论下软件思想的学习
    笔记
    方法论究竟为社区提供了什么
  • 原文地址:https://www.cnblogs.com/kingshow123/p/checkurl.html
Copyright © 2011-2022 走看看