Test соединения с интернетом
От: merlinJap  
Дата: 29.05.04 05:09
Оценка: 19 (2)
Доброго времени суток всем......
В последнее время много вопросов как же с 100% верояностью узнать есть ли возможность пользоваться
инетом с машмны или нет. Вот и сам задался таким вопросом . Нашел много интересных примеров но в них
то одни минусы то другие, по этому решил написать свою функцию реалтзующую такую возможность (не гарантирую
что в ней нет минусов....скорее всего есть...но меня пока устраивает ).
ее можно запускать как в теле главного потока так и в отдельном.

Одним словом...смотрите...пробуйте...используйте...
(если будут замечания по написанию кода...выслушаю...с большим удовольствием)
Да....и помоему ася делает что то подобное при помощи своего ICQNet.exe

Хидер

//------------------------------------------------------------------
//
// Source for testing the real existing connection to internet
// by using three methods
//
// 1. gethostbyname
// 2. InternetGetConnectedState
// 3. IcmpSendEcho
//
//
//  [5/29/2004]                Denis Tupichkin 2004 Accretech
//------------------------------------------------------------------

#ifndef _CHECKINETC_H_
#define _CHECKINETC_H_

#include <winsock.h>
#include <windows.h>

#define mINTERNET_CONNECTION_MODEM      1
#define mINTERNET_CONNECTION_LAN        2
#define mINTERNET_CONNECTION_MODEM_BUSY 8
#define mINTERNET_CONNECTION_PROXY      4

#define IP_DEST_NET_UNREACHABLE         11002
#define IP_DEST_HOST_UNREACHABLE        11003
#define IP_DEST_PROT_UNREACHABLE        11004
#define IP_DEST_PORT_UNREACHABLE        11005
#define IP_REQ_TIMED_OUT                11010
#define IP_TTL_EXPIRED_TRANSIT          11013



const UINT BASE                   = 0;
const UINT CONNECTION_ESTABLISHED = BASE + 1;
const UINT ERROR_LOAD_ICMP_DLL    = BASE + 2;
const UINT ERROR_INIT_WSA         = BASE + 3;
const UINT ERROR_GET_ICMP_FUN     = BASE + 4;
const UINT ERROR_LOAD_WININET_DLL = BASE + 5;
const UINT ERROR_LOAD_WININET_FUN = BASE + 6;
const UINT ERROR_CON_STATE_FALSE  = BASE + 7;
const UINT ERROR_DNS_SERVICE      = BASE + 8;
const UINT ERROR_ICMP_CREATE_FILE = BASE + 9;
const UINT ERROR_ICMP_ALLOC_MEM   = BASE + 10;
const UINT ERROR_NOT_ESTABLISHED  = BASE + 11;




//---------------------------------------------------------------------------
typedef struct {
   unsigned char m_Ttl;                                 // Time To Live
   unsigned char m_Tos;                                 // Type Of Service
   unsigned char m_Flags;                               // IP header flags
   unsigned char m_OptionsSize;                         // Size in bytes of options data
   unsigned char *m_pOptionsData;                       // Pointer to options data
} IP_OPTION_INFORMATION, * PIP_OPTION_INFORMATION;
//---------------------------------------------------------------------------
typedef struct {
   unsigned int m_Address;                    // Replying address
   unsigned long  m_Status;                   // Reply status
   unsigned long  m_RoundTripTime;            // RTT in milliseconds
   unsigned short m_DataSize;                 // Echo data size
   unsigned short m_Reserved;                 // Reserved for system use
   void *m_pData;                              // Pointer to the echo data
   IP_OPTION_INFORMATION m_strOptions;           // Reply options
} IP_ECHO_REPLY, * PIP_ECHO_REPLY;

//-------------------------------------------------------------------
// icmp.dll
typedef HANDLE (WINAPI* ICMPCreateFile)(VOID);
typedef BOOL   (WINAPI* IcmpCloseHandle)(HANDLE);
typedef DWORD  (WINAPI* IcmpSendEcho)(HANDLE, DWORD, LPVOID, 
                    WORD,PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);
// wininet.dll
typedef BOOL   (WINAPI* IInternetGetState)(LPDWORD,DWORD);

//-------------------------------------------------------------------
extern UINT TestInetConnection(unsigned int Timeout);
//---------------------------------------------------------------------------


#endif


СРР:


//------------------------------------------------------------------
//
//
//  [5/29/2004]                Denis Tupichkin 2004 Accretech
//------------------------------------------------------------------


#include "stdafx.h"
#include "checkinetc.h"

#pragma comment(lib,"ws2_32.lib")

char rem_host[] = "www.com";

UINT TestInetConnection(unsigned int Timeout)
{
    // test internet possibilities
    
    // load wininet.dll
    HANDLE hWinInet = LoadLibrary("wininet.dll");
    if (!hWinInet){
        return     ERROR_LOAD_WININET_DLL;
    }
    // det InternetGetConnectedState address
    IInternetGetState pInternetGetConnectedState; 
    pInternetGetConnectedState = (IInternetGetState) GetProcAddress((HINSTANCE__*)hWinInet,
                                       "InternetGetConnectedState");
    if(!pInternetGetConnectedState){
        FreeLibrary((HINSTANCE__*)hWinInet);
        return ERROR_LOAD_WININET_FUN;
    }
    //////////////////////////////////////////////////////////////////////////
    // test 
    //////////////////////////////////////////////////////////////////////////
    DWORD flag = mINTERNET_CONNECTION_MODEM | mINTERNET_CONNECTION_LAN | 
                 mINTERNET_CONNECTION_MODEM_BUSY | mINTERNET_CONNECTION_PROXY;
    bool   res = pInternetGetConnectedState((LPDWORD)&flag, (int)0);    
    // if !res it is means not connection 
    if(!res){
        FreeLibrary((HINSTANCE__*)hWinInet);
        return ERROR_CON_STATE_FALSE;
    }

    // init WSA
    WSADATA wsaData;
    if(WSAStartup( MAKEWORD( 1, 0 ), &wsaData )){ 
        FreeLibrary((HINSTANCE__*)hWinInet);
        return ERROR_INIT_WSA;
    }

    // try to get DNS service and translate to IP 
    struct in_addr  DestAddress;
    struct hostent* pHostEnt;
 
    DestAddress.s_addr     = inet_addr(rem_host);
    if (DestAddress.s_addr == INADDR_NONE){
      pHostEnt = gethostbyname(rem_host);
    }else{
      pHostEnt = gethostbyaddr((const char *)&DestAddress, sizeof(struct in_addr), AF_INET);
    }
    if (pHostEnt == NULL) {
           FreeLibrary((HINSTANCE__*)hWinInet);
        WSACleanup();
        return ERROR_DNS_SERVICE;
    }
    // load ICMP
    HANDLE hIcmp = LoadLibrary("ICMP.DLL");    
    if (!hIcmp){
        WSACleanup();
        return     ERROR_LOAD_ICMP_DLL;
    }

    ICMPCreateFile pIcmpCreateFile;
    IcmpCloseHandle pIcmpCloseHandle;
    IcmpSendEcho pIcmpSendEcho;
  
    pIcmpCreateFile  = (ICMPCreateFile) GetProcAddress((HINSTANCE__*)hIcmp,
                                       "IcmpCreateFile");
    pIcmpCloseHandle = (IcmpCloseHandle)GetProcAddress((HINSTANCE__*)hIcmp,
                                       "IcmpCloseHandle");
    pIcmpSendEcho    = (IcmpSendEcho)   GetProcAddress((HINSTANCE__*)hIcmp,
                                       "IcmpSendEcho");
    //
    if((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || (pIcmpSendEcho == 0)){
        FreeLibrary((HINSTANCE__*)hIcmp);
        WSACleanup();
        return     ERROR_GET_ICMP_FUN;
    }
    // try to create  services file 
    HANDLE hIP = pIcmpCreateFile();
    if (hIP == INVALID_HANDLE_VALUE) {
        FreeLibrary((HINSTANCE__*)hIcmp);
        FreeLibrary((HINSTANCE__*)hWinInet);
        WSACleanup();
        return ERROR_ICMP_CREATE_FILE;
        }
    // allocate memory for message
    char cLine[1024]={0};         // for reply
    char acPingBuffer[32]={0};    // for request
    
    PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc(GHND, sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer));
    if (pIpe == 0) {
        pIcmpCloseHandle(hIP);
        FreeLibrary((HINSTANCE__*)hIcmp);
        FreeLibrary((HINSTANCE__*)hWinInet);
        WSACleanup();
        return ERROR_ICMP_ALLOC_MEM;
    }
   
    pIpe->m_pData = acPingBuffer;
    pIpe->m_DataSize = sizeof(acPingBuffer);
    // send request
    int dwStatus = pIcmpSendEcho(hIP,
                *((unsigned int*)pHostEnt->h_addr_list[0]),
                acPingBuffer, sizeof(acPingBuffer), NULL, pIpe,
                sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), Timeout);

    UINT final_res = 0;
    
    if (dwStatus == 0)
    {   // if reply was received 
        final_res =  ERROR_NOT_ESTABLISHED;
    }else{
        final_res = CONNECTION_ESTABLISHED; 
    }
    //close all instances
    pIcmpCloseHandle(hIP);
    FreeLibrary((HINSTANCE__*)hIcmp);
    FreeLibrary((HINSTANCE__*)hWinInet);
    WSACleanup();

    return final_res;
}


Исспользовать след. образом


if(TestInetConnection(100) == CONNECTION_ESTABLISHED){
// успех
}else{
// оштбка
}




С уважением.....удачи...
С уважением merlinjap.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.