Доброго времени суток всем......
В последнее время много вопросов как же с 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{
// оштбка
}
С уважением.....удачи...