Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Условие подключения к инету (https://forum.antichat.xyz/showthread.php?t=166852)

marcos 29.12.2009 09:15

Условие подключения к инету
 
Всем привет!
Подскажите как самым оптимальным условием проверить подключение к инету на С++

вот примерно такой структурой
Код:

If {условие}
остальной код


slesh 29.12.2009 10:17

реальное подключение к инету ты можешь проверить тока определив ip какогонить крупного сайта.
типа определить имя ip адрес google.com
Если определился, значит инет есть. Хотя если юзается кеш DNS то может и не быть инета, а данные берутся из кеша.

Но самый действенный способ - просто подрубиться к какомунить сайта, есть подрубился и получил страницу, то инет есть. Единственное что не провериш, если доступ в инет через прокси идет.

lo0 29.12.2009 10:42

slesh, DNS, www от этих сервисов не всегда можно получить достоверную инфу.
Некоторые ISP отдают зоны даже при отключ. инете, с www - прокся.
Обычно админы используют icmp на шлюз. Т.е. если шлюз доступен - инет работает или проблема у ISP, если шлюз не доступен - инета и быть не может :)

sn0w 29.12.2009 16:12

так думаю вернее будет

Код:

#include <WinSock2.h>
#pragma comment(lib, "ws2_32")

BOOL IsOnline()
{
        WSADATA wsd;
        WSAStartup(0x202, &wsd);

        SOCKET sck;
        SOCKADDR_IN addr;
        int rc;

        addr.sin_family = AF_INET;
        // standard http port
        addr.sin_port = htons(80);
        // mail.ru ip
        addr.sin_addr.S_un.S_addr = inet_addr("217.69.128.44");

        sck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        rc = connect(sck, (LPSOCKADDR)&addr, sizeof(addr));

        if(rc == 0){
                closesocket(sck);
                return TRUE;
        }


        return FALSE;
}


int _tmain(int argc, _TCHAR* argv[])
{

        if(IsOnline()){
                MessageBox(0, "ONLINE", 0, 0);
        }else{
                MessageBox(0, "OFFLINE", 0, 0);
        }


        return 0;
}


Ins3t 29.12.2009 17:25

Код:

#undef UNICODE
#include <winsock2.h>
#pragma comment( lib, "wsock32.lib" )
int main(int argc, char* argv[])
        {
        sockaddr_in s_a;
        WSADATA wd;
        WSAStartup( MAKEWORD( 2, 2 ), &wd );
        SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
        if (s == INVALID_SOCKET)
                {
                return 255;
                }
        s_a.sin_addr.s_addr = inet_addr( "217.69.128.44" );
        s_a.sin_port = htons( 80 );
        s_a.sin_family = AF_INET;
        if (connect( s, (struct sockaddr*)&s_a, sizeof( s_a ) ) == SOCKET_ERROR)
                {
                MessageBox(0,"OFFLINE!","Winname",MB_OK);
                }
        else
                {
                MessageBox(0,"ONLINE!!","Winname",MB_OK);
                }
        closesocket( s );
        WSACleanup();
        return 0;
        }

Вот без создания ф-и.
Если нужен постоянный мониторинг - юзай цикл.

lo0 29.12.2009 17:52

А вот пару примеров, из которых два выше варианта работать не будут:
217.69.128.44 упал на 10 сек, а в этот момент была проверка
Траблы с маршрутизацией, BGP такое дело
И снова коннект на 80 порт, это не разумно проверять конект на веб-сервер

Retimiled 29.12.2009 19:12

tracert до отрезолвленного msn.com
условие присутствия интернета это ответ следующего за вашим гейта!

... хотя можно и пингануть гейт провайдера!

Интернет - это не америка не корневые ДНС сервера!
Интернет -это среда переноса информации!

lo0 29.12.2009 19:20

Цитата:

Сообщение от Retimiled
... хотя можно и пингануть гейт провайдера!

А кокой гейт-то пинговать? У меня 4 канала(BGP)

Retimiled 29.12.2009 19:25

ну свой гейт комп знает ....поэтому в логике я и писал трейсерт (icmp c временем жизни +1 от времени TTL при котором ответил свой гейт)

lo0 29.12.2009 19:30

Retimiled, согласен!

PS: Осталось реализовать на с++


Время: 01:25