С++ КАК ПРОВЕРИТЬ ПОДКЛЮЧЕНИЕ К ИНТЕРНЕТУ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by tester_new, 14 Apr 2012.

  1. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    Как корректно проверить подключен инет или нет...

    PS: всякие костыли типо пингов куда то или gethostname() не катят... последний при наличнии локального подключения не работает...(хотя может это именно у меня так настроены dns в сетки)
     
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    tester_new, а поиск никак? уже ни раз обсуждалось тык
     
  3. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    никак, у меня те примеры и на основе их нефига не работает....

     
  4. Indev

    Indev New Member

    Joined:
    23 Dec 2011
    Messages:
    59
    Likes Received:
    3
    Reputations:
    0
    CODE

    Ping
    Code:
    int pin;
    char * ping = "ping 8.8.8.8";
    pin = system(ping);
    //Пинга нет; 
    if (pin != 0) 
    { 
    cout << "No" << "\n"; 
    } //Пинг есть; 
    else if (pin == 0) 
    { 
    cout << "Yes" << "\n"; 
    }
    Необходим инклуд <windows.h> для system и <iostream> для cout.
     
  5. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    Может будет и пошустрей чуть...

    Спасибо большое) ! скажите что не так в моем примере..
     
  6. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    Все так, код рабочий. С юникодом только может налажал. Если так, то замена на InternetCheckConnectionA поможет.
     
  7. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Посоветую самый простой вариант=)
    Code:
    GetSystemMetrics()+SM_NETWORK 
     
  8. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    Вроде она просто показывает наличие подключения по локальной сети(что сетевая есть и она работает)...
    А мне именно нужно проверить подключение к интернету..
     
  9. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    тащемта венда, особенно седьмая, считает что она в интернетах, если способна разрешить ип некоторых своих хостов. так и пишется в центре управления сетями - интернет! а интернета нет. но тут и джопа. прову вашему пох на днс, все к вашим услугам на халяву, да вот только чтобы неднсный трафик пустить, нужно- логиниться на впн серваке (итд итп). поэтому самое эффективное - пинг нескольких хостов. можно корневых днсов.
     
  10. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    А просто попытаться приконнектиться к гуглу и подождать таймаута религия не позволяет?
     
  11. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    Мне религия позволяет! ты пример напиши лучше!
    Я хотел это реализовать без использования winsock.h(что бы это меньше отражалось на весе программы), думал есть стандартные функции (wininet.h) которые могут определить есть инет или нет, вот и все...!

    Думаю пригодиться (если что исправляйте) использую Ip яндекса так как при попытке с моей сети подключиться на google.com на 80 порт функция connect() всегда возвращает true

    Code:
    bool GetStatusConnect()
    {  
       char buff[1024];
          if (WSAStartup(0x202, (WSADATA *)&buff[0])) return 0;
        SOCKET my_sock = socket(AF_INET, SOCK_STREAM, 0);
          if (my_sock < 0) return 0;
        sockaddr_in dest_addr;
        dest_addr.sin_family = AF_INET;
        dest_addr.sin_port = htons(80);
        HOSTENT *hst;
          dest_addr.sin_addr.s_addr = inet_addr("93.158.134.203");
             if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)) == -1) return 0; 
        closesocket(my_sock);
        WSACleanup();
        return 1;
    }
    
     
  12. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    блджад.

    IcmpCreateFile
    IcmpSendEcho

    всио
     
    2 people like this.
  13. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24
    Это уже работает точно :) надеюсь кому то понадобиться!
    Code:
    bool IcmpPing() { 
        HANDLE hIcmpFile;
        unsigned long ipaddr = INADDR_NONE;
        DWORD dwRetVal = 0;
        char SendData[32] = "Data Buffer";
        LPVOID ReplyBuffer = NULL;
        DWORD ReplySize = 0;
        ipaddr = inet_addr("8.8.8.8");
    	if (ipaddr == INADDR_NONE)
    		return 0;
        hIcmpFile = IcmpCreateFile();
    	 if (hIcmpFile == INVALID_HANDLE_VALUE)
    		 return 0;
        ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
        ReplyBuffer = (VOID*) malloc(ReplySize);   
        dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 1000);
        if (dwRetVal) {
            PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
            struct in_addr ReplyAddr;
            ReplyAddr.S_un.S_addr = pEchoReply->Address;
    		return 1;
        }
          else 
            return 0; 
    }