как узнать подключен ли нтернет?

Тема в разделе "WASM.NETWORKS", создана пользователем asmic, 2 мар 2007.

  1. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Подскажите пожалуйста. С помомощью какой функции можно узнать подключён ли интернет ( т.е. надо узнать состояние интернет соединения - подключено или нет ). И если не трудно опишите её и напишите пожалуйста наглядный пример. Заранее спасибо.
     
  2. MCNet

    MCNet New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    74
    Ну, например ping.exe можно заюзать вместо функции
     
  3. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    internetCheckConnection

    site bd "www.ya.ru",0

    push 0
    push 1 ; тут полюбому оставь единицу ....так как при 0 не всегда работает ..это
    ;показатель какой сервер для проверки используется
    push offset site
    call internetCheckConnection
    cmp eax, 1
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    InternetGetConnectedState
     
  5. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    -offtope
    MCNet
    %)))
     
  6. MCNet

    MCNet New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    74
    WIN32
    [offtop]
    Ну я поздно понял что требовалось 8-)
    [/offtop]
     
  7. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    ???
    Код (Text):
    1. InternetGetConnectedState = 0 ;( нет интернета )
    2. InternetCheckConnection = 0    ;( нет интернета )
    3. IP-address = 192.168.1.1         ;( нет интернета )
    Но я ведь с этого компа пишу этот пост!

    Когда так бывает? ;)))
     
  8. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    частенько так бывает.

    Я так проверяю:

    Код (Text):
    1. internet proc ; проверка соединения с интернет
    2. PUSH offset wsa                  
    3. PUSH 202h
    4. CALL WSAStartup
    5.  
    6. bad:
    7. PUSH offset google
    8. CALL gethostbyname
    9. test eax, eax
    10. jnz good
    11. push 5000
    12. call Sleep
    13. jmp bad
    14. good:
    15.     Ret
    16. internet endp
     
  9. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    Когда долго не отпускает :)))
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Какой частый вопрос) Нарыл старые кодесы, глянул:

    1. Если интересует именно статус соединений RAS (remote access service - виндовый сервис, управляющий подключениями PPTP (VPN), PPPoE и др, часто используемыми для соединения с интернетом), то смотреть в сторону RasEnumConnections: http://msdn.microsoft.com/en-us/library/aa377284(v=vs.85).aspx
    Там же есть и example, выводящий список подключенных соединений.
    Header: ras.h
    Library: rasapi32.lib
    Depends: rasapi32.dll


    2. Так же стоит посмотреть и на InternetGetConnectedState
    Код (Text):
    1. BOOL
    2. WINAPI
    3. InternetGetConnectedState(
    4.     __out  LPDWORD  lpdwFlags,
    5.     __reserved DWORD    dwReserved);
    Нужные флажки - ((dwFlags & INTERNET_CONNECTION_CONFIGURED) && (dwFlags & (INTERNET_CONNECTION_LAN|INTERNET_CONNECTION_MODEM)) && !(dwFlags & INTERNET_CONNECTION_OFFLINE))
    Но она работает только в одну сторону - отрицательный результат говорит о том, что инета нет, но положительный не обязательно означает наличие активного подклчения.
    Header: wininet.h
    Library: wininet.lib
    Depends: wininet.dll


    3. Грязный хак - попробвать подключиться (например, InternetOpen + InternetOpenUrl)
    4. Весьма надежно, но все равно "нелегально" - попробовать резолвнуть какое-нибудь доменное имя, например, www.ru
    5. Послать ICMP Echo Request (ping) к серверу с известным IP адресом, например, корневому DNS серверу (Например, DNS Root 'A': 198.41.0.4)
    API: IcmpCreateFile + IcmpSendEcho + IcmpParseReply
    Header: icmpapi.h
    Library: iphlpapi.lib
    Depends: iphlpapi.dll / icmp.dll


    Все вместе:
    Код (Text):
    1. #include <WinSock2.h>
    2. #include <tchar.h>
    3. #include <Ras.h>
    4. #include <stdio.h>
    5. #include <Wininet.h>
    6. #include <IntShCut.h>
    7. #include <IPExport.h>
    8. #include <ICMPApi.h>
    9. #include <Ws2tcpip.h>
    10.  
    11. #pragma comment (lib, "wininet")
    12. #pragma comment (lib, "rasapi32")
    13. #pragma comment (lib, "url")
    14. #pragma comment (lib, "Iphlpapi")
    15. #pragma comment (lib, "ws2_32")
    16.  
    17. // check ras connections
    18. bool IsRasConnected()
    19. {
    20.     DWORD dwCb = sizeof(RASCONN);
    21.     DWORD dwErr = ERROR_SUCCESS;
    22.     DWORD dwRetries = 5;
    23.     DWORD dwConnections = 0;
    24.     RASCONN* lpRasConn = NULL;
    25.  
    26.     //
    27.     // Loop through in case the information from RAS changes between calls.
    28.     //
    29.     while (dwRetries--)
    30.     {
    31.         //
    32.         // If the memory is allocated, free it.
    33.         //
    34.         if (NULL != lpRasConn)
    35.         {
    36.             HeapFree(GetProcessHeap(), 0, lpRasConn);
    37.             lpRasConn = NULL;
    38.         }
    39.         //
    40.         // Allocate the size needed for the RAS structure.
    41.         //
    42.         lpRasConn = (LPRASCONN) HeapAlloc(GetProcessHeap(), 0, dwCb);
    43.         if (NULL == lpRasConn)
    44.         {
    45.             dwErr = ERROR_NOT_ENOUGH_MEMORY;
    46.             break;
    47.         }
    48.         //
    49.         // Set the structure size for version checking purposes.
    50.         //
    51.         lpRasConn->dwSize = sizeof(RASCONN);
    52.         //
    53.         // Call the RAS API then exit the loop if we are successful or an unknown
    54.         // error occurs.
    55.         //
    56.         dwErr = RasEnumConnections(
    57.             lpRasConn,
    58.             &dwCb,
    59.             &dwConnections);
    60.         if (ERROR_INSUFFICIENT_BUFFER != dwErr)
    61.         {
    62.             break;
    63.         }
    64.     }
    65.     //
    66.     // In the success case, print the names of the connections.
    67.     //
    68.     if (ERROR_SUCCESS == dwErr)
    69.     {
    70.         DWORD i;
    71.  
    72.         printf("\tActive RAS connections:\n");
    73.         for (i = 0; i < dwConnections; i++)
    74.         {
    75.             printf("\t * [%ws]\n", lpRasConn[i].szEntryName);
    76.         }
    77.     }
    78.     else
    79.     {
    80.         printf("\tRAS: RasEnumConnections failed: Error = %d\n", dwErr);
    81.     }
    82.     //
    83.     // Free the memory if necessary.
    84.     //
    85.     if (NULL != lpRasConn)
    86.     {
    87.         HeapFree(GetProcessHeap(), 0, lpRasConn);
    88.         lpRasConn = NULL;
    89.     }
    90.  
    91.     return (dwConnections > 0);
    92. }
    93.  
    94. void icmp_err (DWORD Status)
    95. {
    96.     switch (Status)
    97.     {
    98.     case IP_SUCCESS: printf("\t  : Successful\n"); break;
    99.     case IP_DEST_NET_UNREACHABLE: printf("\t  : Destination net unreachable\n"); break;
    100.     case IP_DEST_HOST_UNREACHABLE: printf("\t  : Destination host unreachable\n"); break;
    101.     case IP_REQ_TIMED_OUT: printf("\t  : Request timed out\n"); break;
    102.     case IP_BAD_DESTINATION: printf("\t  : Bad destination\n"); break;
    103.     case IP_BAD_ROUTE: printf("\t  : Bad route\n"); break;
    104.     default: printf("\t  : failure (0x%x)\n", Status);
    105.     }
    106. }
    107.  
    108. // send ICMP Echo Request to the specified host
    109. bool IcmpTestEcho (const char *host, bool *pbStatus)
    110. {
    111.     HANDLE hIcmpFile;
    112.     char IcmpData[] = "abcdefghijklmnopqrstuvwxyz";
    113.     char ReplyBuffer[512] = {0};
    114.     DWORD ReplySize = sizeof(ReplyBuffer);
    115.     DWORD IcmpTimeout = 1000; // ICMP echo timeout : 3000 ms
    116.     bool success = false;
    117.  
    118.     if ((hIcmpFile = IcmpCreateFile()) != INVALID_HANDLE_VALUE)
    119.     {
    120.         PADDRINFOA addrinfo = 0;
    121.         if (getaddrinfo (host, 0, 0, &addrinfo) != -1)
    122.         {
    123.             DWORD dwRetVal = IcmpSendEcho (hIcmpFile,
    124.                 ((PSOCKADDR_IN)addrinfo->ai_addr)->sin_addr.s_addr,
    125.                 IcmpData, strlen(IcmpData),
    126.                 NULL,
    127.                 ReplyBuffer,
    128.                 ReplySize,
    129.                 IcmpTimeout);
    130.  
    131.             if (dwRetVal != 0)
    132.             {
    133.                 PICMP_ECHO_REPLY EchoReply = (PICMP_ECHO_REPLY) ReplyBuffer;
    134.  
    135.                 struct in_addr ReplyAddr;
    136.                 ReplyAddr.S_un.S_addr = EchoReply->Address;
    137.                 printf("\tSent icmp message to %s\n", host);
    138.                 if (dwRetVal > 1) {
    139.                     printf("\tReceived %ld icmp message responses\n", dwRetVal);
    140.                     printf("\tInformation from the first response:\n");
    141.                 }    
    142.                 else {    
    143.                     printf("\tReceived %ld icmp message response\n", dwRetVal);
    144.                     printf("\tInformation from this response:\n");
    145.                 }    
    146.                 printf("\t  Received from %s\n", inet_ntoa( ReplyAddr ) );
    147.                 printf("\t  Status = %ld\n",
    148.                     EchoReply->Status);
    149.                 icmp_err(EchoReply->Status);
    150.  
    151.                 printf("\t  Roundtrip time = %ld milliseconds\n",
    152.                     EchoReply->RoundTripTime);
    153.  
    154.                 *pbStatus = (success = true);
    155.             }
    156.             else
    157.             {
    158.                 printf("\tCall to IcmpSendEcho failed.\n");
    159.                 printf("\tIcmpSendEcho returned error: %ld\n", GetLastError() );
    160.                 icmp_err (GetLastError());
    161.                 success = false;
    162.             }
    163.         }
    164.  
    165.         IcmpCloseHandle (hIcmpFile);
    166.         return success;
    167.     }
    168.     else
    169.     {
    170.         printf("IcmpCreateFile failed\n");
    171.     }
    172.  
    173.     return false;
    174. }
    175.  
    176. // test inet connection by issuing domain name resolving query (DNS request)
    177. // (for domain name 'www.ru')
    178. bool InetTestConnect_Dns()
    179. {
    180.     PADDRINFOA addr = 0;
    181.     const char szDomainName[] = "www.ru";
    182.  
    183.     getaddrinfo (szDomainName, 0, 0, &addr);
    184.  
    185.     printf("\tDNS resolving '%s' ... = %s\n",
    186.         szDomainName,
    187.         addr ? inet_ntoa (((PSOCKADDR_IN)addr->ai_addr)->sin_addr) : "(no addr)"
    188.         );
    189.  
    190.     freeaddrinfo (addr);
    191.     return (addr != 0);
    192. }
    193.  
    194. enum ICMP_FAILURE_STATUS {
    195.     ICMP_SUCCESS,
    196.     ICMP_ERROR,
    197.     ICMP_TIMEOUT
    198. };
    199.  
    200. static const char* szIcmpFailureStatus[] = {
    201.     "Succeeded (OK)",
    202.     "Failed (ERROR)",
    203.     "Timed out (ERROR)"
    204. };
    205.  
    206. // test inet connection by sending icmp echo request to the DNS Root Server A
    207. ICMP_FAILURE_STATUS InetTestConnect_Icmp()
    208. {
    209.     bool bIcmp = false;
    210.     const char szDnsRootA[] = "198.41.0.4";
    211.  
    212.     if (!IcmpTestEcho (szDnsRootA, &bIcmp))
    213.         return ICMP_ERROR;
    214.  
    215.     return bIcmp ? ICMP_SUCCESS : ICMP_TIMEOUT;
    216. }
    217.  
    218. // try open WinInet connection
    219. bool InetTestConnect_WinInet()
    220. {
    221.     const WCHAR wszServerName[] = L"google.com";
    222.     int nServerPort = INTERNET_DEFAULT_HTTP_PORT;
    223.     bool bStatus = false;
    224.  
    225.     HINTERNET hInternet = InternetOpen (
    226.         NULL,
    227.         INTERNET_OPEN_TYPE_PRECONFIG,
    228.         NULL,
    229.         NULL,
    230.         0);
    231.  
    232.     if (hInternet != NULL)
    233.     {
    234.         printf("\tInternetOpen : internet handle opened\n");
    235.        
    236.         DWORD dwConnectTimeout = 2000;
    237.         if (!InternetSetOption (hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwConnectTimeout, sizeof(dwConnectTimeout)))
    238.             return printf("\tInternetSetOption : failed\n"), false;
    239.  
    240.         HINTERNET hFile = InternetOpenUrl (hInternet,
    241.             L"http://google.com",
    242.             NULL,
    243.             0,
    244.             0,
    245.             0);
    246.  
    247.         if (hFile != NULL)
    248.         {
    249.             printf("\tInternetOpenUrl : connected\n");
    250.  
    251.             DWORD dwBytesAvailable = -1;
    252.            
    253.             if (!InternetQueryDataAvailable (hFile, &dwBytesAvailable, 0, 0))
    254.                 dwBytesAvailable = -1;
    255.             else
    256.                 bStatus = true;
    257.  
    258.             printf("\tBytes available : %d\n", dwBytesAvailable);
    259.  
    260.             InternetCloseHandle (hFile);
    261.         }
    262.         else
    263.         {
    264.             printf("\tInternetOpenUrl : connect FAILED\n");
    265.         }
    266.  
    267.         InternetCloseHandle (hInternet);
    268.     }
    269.     else
    270.     {
    271.         printf("\tInternetOpen : opening internet handle FAILED\n");
    272.     }
    273.  
    274.     return bStatus;
    275. }
    276.  
    277. void main()
    278. {
    279.     printf("RAS connection status : %s\n\n",
    280.         IsRasConnected() ? "connected (OK)" : "disconnected (ERROR)"
    281.         );
    282.  
    283.     printf("test inet connection [DNS] : %s\n\n",
    284.         InetTestConnect_Dns() ? "true (OK)" : "false (ERROR)"
    285.         );
    286.  
    287.     printf("test inet connection [ICMP] : %s\n\n",
    288.         szIcmpFailureStatus[InetTestConnect_Icmp()]
    289.         );
    290.  
    291.     DWORD dwFlags = 0;
    292.     if (!InternetGetConnectedState (&dwFlags, 0))
    293.         return printf("InternetGetConnectedState failed (last err 0x%x)\n", GetLastError());
    294.     printf("InternetGetConnectedState : flags = 0x%08x;", dwFlags);
    295.     if (dwFlags & INTERNET_CONNECTION_CONFIGURED) printf(" Configured");
    296.     if (dwFlags & INTERNET_RAS_INSTALLED) printf(" RAS-Installed");
    297.     if (dwFlags & INTERNET_CONNECTION_OFFLINE) printf(" Offline");
    298.     if (dwFlags & INTERNET_CONNECTION_LAN) printf(" LAN");
    299.     if (dwFlags & INTERNET_CONNECTION_MODEM) printf(" Modem");
    300.     printf("\n\n");
    301.  
    302.     printf("test inet connection [WinInet] : %s\n\n",
    303.         InetTestConnect_WinInet() ? "true (OK)" : "false (ERROR)"
    304.         );
    305. }
    Вывод при подкллюченном инете:
    При отключенном инете
    PS. Да, я видел дату топика ^)
     
  11. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Спасибо, Great. remote access service вещь хорошая.
    В моем клиническом случае ( интернет раздается через беспроводной роутер )
    msdn example вывел диагноз:
    There are no active RAS connections.

    Надежность, ты сказал, DNS (берется из кэша) как у гадания по кофейной гуще.

    Спасибо за ICMP Echo Request (ping)
    Я в этом слабо разбираюсь, нашел пример Quantum-а
    http://www.wasm.ru/forum/viewtopic.php?id=14447

    И против лома нет приема: InternetOpen :) Он в INTERNET.zip
     
  12. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Есть один жирненький минус.
    Есть ли у программы право доступа в интернет?
    Код (Text):
    1. ; Думаю по-умолчанию у этой программы проблем с доступом не будет.
    2. invoke WinExec, CSTR("C:\Program Files\Internet Explorer\iexplore.exe http://google.com"), 1
    3. ; Дальше устраивать пытки эксплореру.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если у программы нет прав доступа в сеть, на кой черт ей знать, есть ли коннект? )
     
  14. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    для ипв4 есть правила адресации, но тут зависит уже от подключения. за натом такой код ясное дело бесполезен.


    Код (Text):
    1. bool TMain::IsWANAddress(UnicodeString &addr)
    2. {
    3.     // drop locals:
    4.     //10.0.0.0 - 10.255.255.255   a
    5.     //172.16.0.0 - 172.31.255.255  b
    6.     //192.168.0.0 - 192.168.255.255  c
    7.     //169.254.0.0 -169.254.255.255 dhcp noreply
    8.  
    9.     if( !wcsncmp(addr.c_str(), L"192", 3) ||
    10.             !wcsncmp(addr.c_str(), L"127", 3) ||
    11.                 !wcsncmp(addr.c_str(), L"10.", 3) ||
    12.                     !wcsncmp(addr.c_str(), L"172", 3) ||
    13.                         !wcsncmp(addr.c_str(), L"169", 3))
    14.         return false;
    15.  
    16.     return true;
    17. }
    ну необязательно в кеше.. например так

    Код (Text):
    1.     ReverseIP(thisip);
    2.  
    3.     status = DnsQuery_W(UnicodeString(thisip).t_str(),
    4.                             DNS_TYPE_PTR,
    5.                             DNS_QUERY_BYPASS_CACHE,
    6.                             pSrvList,
    7.                             &pDnsRecord,
    8.                             NULL);
    на днях просто кодил одну тему на радстудио, поэтому не удивляйтесь всяким UnicodeString etc )