2012-05-10 9 views
1

Небольшой вопрос: как я могу использовать сокеты Linux для проверки подключения к Интернету внутри программы C? Я слышал, что это самый простой и подходящий метод (вместо вызова ping программы, например), но я просто не знаю, как это сделать.Проверьте подключение к Интернету с разъемами

+3

[Stack Overflow это не ваш личный научный сотрудник.] (Http://meta.stackexchange.com/a/128553/133242) –

+0

[Проверить] (http://www.linuxforums.org /forum/programming-scripting/146792-cc-program-check-internet-connection.html) it.I надеюсь, что это сработает. – vikky

ответ

2

измените его, как хотите. :)

void *parser_online(void *garbage) 
{ 
    int sockfd,val; 
    char buffer[MAX_LINE]; 
    struct hostent *google_ent=NULL; 
    struct sockaddr_in google_addr; 

    sockfd = -1; 

    if((google_ent = gethostbyname("www.google.com")) != NULL) 
    { 
     if((sockfd = socket(google_ent->h_addrtype,SOCK_STREAM,IPPROTO_TCP)) != -1) 
     { 
      val = 1; 
      if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, (char *) &val, sizeof(val)) == 0 && setsockopt(sockfd,IPPROTO_TCP,TCP_NODELAY, (char *) &val, sizeof(val)) == 0) 
      { 
       google_addr.sin_family = google_ent->h_addrtype; 
       memcpy(&(google_addr.sin_addr), google_ent->h_addr, google_ent->h_length); 
       google_addr.sin_port = htons(80); 
       if(connect(sockfd,(struct sockaddr *) &google_addr,sizeof(google_addr)) == 0) 
       { 
        if(write(sockfd,"GET /index.html HTTP/1.1\r\n\r\n", 29) >= 28) 
        { 
         shutdown(sockfd, SHUT_WR); 
         if(read(sockfd, buffer, MAX_LINE) != -1) // all right! 
         { 
          close(sockfd); 
          return (void *) 1; 
         } 
         else 
          report_error("read()",1,0,verbose); 
        } 
        else 
         report_error("write()",1,0,verbose); 
       } 
       else 
        report_error("connect()",1,0,verbose); 
      } 
      else 
       report_error("setsockopt()",1,0,verbose); 
     } 
     else 
      report_error("socket()",1,0,verbose); 
    } 
    else 
     report_error("cannot resolve IP for mom Google.",0,0,error); // this is is the most common error. 

    if(sockfd!=-1) 
     close(sockfd); 
    return (void *) 0; // no internet 

} 
+0

извините .... Я забыл сообщить вам, что вы должны включить sys/socket.h netinet/tcp.h netdb.h netinet/in.h Я думаю, что это все .... если вы компиляции ошибок просто сделать: 'Grep -nr "MISSING_MACRO"/ USR/включать ' –

+0

ах! если вы не хотите проверять HTTP, а только статус Интернета, вы можете остановить вызов 'connect()'. –

+0

Этот код использует имя хоста. Лучше проверить ip-адрес, например 8.8.8.8. Чтобы отделить случай: связь нарушена от dns, разрешение нарушено – ArthurLambert

0

Попробуйте подключиться к известному хосту (скажем, google.com) в хорошо открытом порту, например, 80. Если он не работает, есть хороший шанс, что интернет не работает. Вот учебник сокета, который поможет вам начать работу: http://www.linuxhowtos.org/C_C++/socket.htm.

+0

(Не был ли мой нисходящий, все еще :) Может быть, небрежная терминология? «Интернет не работает»? Это глупо, поскольку Интернет никогда не падает (в целом). Сетевые инженеры ссылаются на такие проблемы, как «потеря сетевого подключения», «проблемы маршрутизации», «недоступный хост/сеть/порт» и т. Д. – Jens

Смежные вопросы