2016-01-28 2 views
3

Я не знаю, существует ли функция, которая позволяет мне узнать, существует ли URL-адрес. Надеюсь, это возможно на языке C.Как проверить, существует ли URL-адрес (https) на языке C?

+1

Технически говоря, любой URL "существует" до тех пор, как вы пишете его где-нибудь. Я подозреваю, что вам действительно нужно проверить, возвращает ли запрос 200 HTTP-код, верно? – SirDarius

+2

Что значит, существует? Найти URL в строке? или выяснить, действительно ли URL-адрес действителен и не возвращает 404? Единственный способ проверить, является ли он действительным ресурсом, - это на самом деле нажать на URL (например, выполнить HTTP-запрос) и проверить наличие ошибок. –

+0

Я имел в виду, если сайт существует. Да, это не возвращает 404 или другие ошибки. –

ответ

1

Это не оптимальный ответ, потому что многие люди там скажут, что system() is evil. Но это работает, если у вас есть wget установлен ...

В C++:

int webCheck(const std::string &url) 
{ 
    return (std::system(("wget --spider -q " + url).c_str())); 
} 

Так что я думаю, что в C:

int webCheck(const char url[]) 
{ 
    return (system(strcat("wget --spider -q ", url))); 
} 

возвращает 0, если все прошло хорошо, так что вы могли бы сделать это:

if(!webCheck("http://www.cplusplus.com/reference/cstdlib/system/")) 
{ 
    printf("OK"); 
} 

Вот ценности, которые она может вернуться:

> 0. No problems occurred. 
> 1. Generic error code. 
> 2. Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc... 
> 3. File I/O error. 
> 4. Network failure. 
> 5. SSL verification failure. 
> 6. Username/password authentication failure. 
> 7. Protocol errors. 
>8 Server issued an error response. 
> 
> With the exceptions of 0 and 1, the lower-numbered exit codes take 
> precedence over higher-numbered ones, when multiple types of errors 
> are encountered. 

Источник: wget man page

0

Если вы не возражаете против использования CURL, вот небольшой C программа, которая использует функцию check_url для проверки URL. Функция возвращает 1, если запрос выполнен успешно, и 0 в противном случае.

Invoke, как:

./a.out http://example.com

#include <stdio.h> 
#include <curl/curl.h> 
#include <curl/easy.h> 

int check_url(char *url) 
{ 
    CURL *curl; 
    CURLcode response; 

    curl = curl_easy_init(); 

    if(curl) { 
     curl_easy_setopt(curl, CURLOPT_URL, url); 

     /* don't write output to stdout */ 
     curl_easy_setopt(curl, CURLOPT_NOBODY, 1); 

     /* Perform the request */ 
     response = curl_easy_perform(curl); 

     /* always cleanup */ 
     curl_easy_cleanup(curl); 
    } 

    return (response == CURLE_OK) ? 1 : 0; 
} 

int main(int argc, char *argv[]) 
{ 
    int result = check_url(argv[1]); 

    if (result) 
     printf("Success!\n"); 
    else 
     printf("Failed...\n"); 

    return 0; 
} 
Смежные вопросы