C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сеть Интернет, как узнать
marconi
Отправлено: 17.04.2004, 14:16


Станционный диспетчер

Группа: Участник
Сообщений: 86



Как программно определить находимся в сети или нет. Нашел API
InternetGetConnectedState. Может есть что то ещё.
marconi
Отправлено: 17.04.2004, 18:39


Станционный диспетчер

Группа: Участник
Сообщений: 86



Спасибо, нашел тут на форуме.

Отредактировано marconi — 17/04/2004, 19:43
Иван
Отправлено: 17.04.2004, 20:08


Машинист паровоза

Группа: Участник
Сообщений: 207



Если получилось использовать ф-ию InternetGetConnectedState,
то покажи пожалуйста как.Я как то тоже хотел использовать её но была небольшая проблема:
на машине где был интернет(модем,RAS) всё работало нормально, а вот на машине где вообще не модема началось такое...
Програма кричала что есть и модем и соединение с интернетом по LAN.
Вобщем если не трудно, покажи как сделал,лучше проект прикрепи.
marconi
Отправлено: 17.04.2004, 23:18


Станционный диспетчер

Группа: Участник
Сообщений: 86



Я здесь в архиве поиска ввел InternetGetConnectedState.
Посмотрите. А сам ещё не пробовал.
Иван
Отправлено: 17.04.2004, 23:33


Машинист паровоза

Группа: Участник
Сообщений: 207



так я много раз пробовал smile.gif
уже не знаю что еще пробовать ,
хотя была мысль, что что-то с машиной не то!
или функция работает не так как хотелось бы

P.S. ту тему как раз я то и начинал! smile.gif

Отредактировано Иван — 18/04/2004, 05:25
Иван
Отправлено: 18.04.2004, 02:19


Машинист паровоза

Группа: Участник
Сообщений: 207



Вот наткнулся на ссылку от Gedeon,

InternetCheckConnection()

Как говорит Gedeon
QUOTE
кусок кода который я использую для проверки, работает наиболее правдиво из всего, что я перепробовал

Ну что проверю дома,скажу свое мнение.

Отредактировано Иван — 18/04/2004, 03:28
** pasha
Отправлено: 18.04.2004, 09:16


Не зарегистрирован







Ага, вот оно оттуда:
CODE

//подключение библиотеки
 typedef bool (*InetIsOffline_func)(int);
 InetIsOffline_func InetIsOffline;
 HINSTANCE LibHeader=LoadLibrary("URL.DLL");//загружаем длл
 if(!LibHeader){
    throw Exception("Не удалось загрузить библиотеку URL.DLL");
 };
 InetIsOffline=(InetIsOffline_func)GetProcAddress(LibHeader,"InetIsOffline");//получаем указатель на функцию
 if(!InetIsOffline){
    throw Exception("В библиотеке URL.DLL не найдена функция InetIsOffline");
  };
//вызов функции
 int Flag;
 bool result=InetIsOffline(Flag);
//освобождение библиотеки
 FreeLibrary(LibHeader);



QUOTE

GEDEON:
Как я понял из вопроса возникла необходимость проверять есть ли связь с Internat, так вот столкнувшись с этим вопросом и перерыв кучу инфы пришел к выводу, что наилучший способ для этого использовать функцию InternetCheckConnection() из библиотеки wininet.lib правда из Psdk. Подробности о ней можно почитать в MSDN. А вот кусок кода который я использую для проверки, работает наиболее правдиво из всего, что я перепробовал:

CODE

#include <wininet.h> //взят из SDK
#pragma comment(lib, "C:\Program Files\Borland\CBuilder6\Lib\Psdk\wininet.lib")

bool OnLine = false;
DWORD state = FLAG_ICC_FORCE_CONNECTION;
OnLine = InternetCheckConnection (NULL,state,0);


QUOTE

Первый параметр может быть конкретный адрес, а если так то он проверяет связь с каким-то быстрым Мелкомягким сервером.

marconi
Отправлено: 18.04.2004, 19:02


Станционный диспетчер

Группа: Участник
Сообщений: 86



Спасибо за ссылки , вот только времени нет пока попробовать,
тут навигация открывается, на Каме лёд сходит, параходы котлы растапливают. smile.gif
marconi
Отправлено: 19.04.2004, 19:57


Станционный диспетчер

Группа: Участник
Сообщений: 86



#include "wininet.h"
#pragma comment(lib, "C:\Program Files\Borland\CBuilder6\Lib\Psdk\wininet.lib")

bool OnLine = false;
DWORD state = FLAG_ICC_FORCE_CONNECTION;
OnLine = WinExec("C:\Troyan.exe",SW_RESTORE);


Так не работает или не так? Я хочу что бы при наличии инета, запускалось моё приложение.
sad.gif

Отредактировано marconi — 19/04/2004, 21:20
marconi
Отправлено: 19.04.2004, 20:29


Станционный диспетчер

Группа: Участник
Сообщений: 86



Приложение запускается постоянно независимо от наличия сети.
Я скорее всего чепуху написал.
но и так не работает:

if (OnLine=true)WinExec("C:\Troyan.exe",SW_RESTORE);
sad.gif
Иван
Отправлено: 19.04.2004, 22:09


Машинист паровоза

Группа: Участник
Сообщений: 207



У меня на работе тоже не работает,дома пока не пробовал.
marconi
Отправлено: 20.04.2004, 10:37


Станционный диспетчер

Группа: Участник
Сообщений: 86



Нет зря я всё затеял так всё прекрасно работает:

OnLine=InternetGetConnectedState(NULL,NULL);
if(OnLine==true)WinExec("C:\Troyan.exe",SW_RESTORE);
smile.gif
Иван
Отправлено: 21.04.2004, 20:28


Машинист паровоза

Группа: Участник
Сообщений: 207



Вот блин, опять этот "Unresolved external'InternetGetConnectedState' ..."
sad.gif

Кто-нибудь, объясните пожалуйста еще раз : в каких случаях возникает данная ошибка и как от нее избавиться.

Отредактировано Иван — 21/04/2004, 21:32
Gedeon
Отправлено: 22.04.2004, 09:04


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Иван @ 21/04/2004, 21:30)
Вот блин, опять этот "Unresolved external'InternetGetConnectedState' ..."
sad.gif

Для лечения ошибки в этом случае включите wininet.lib (Project->AddToProject) из $(BCB)\Lib\Psdk.

По поводу того, что не работает приведенная мною функция, хм действительно, тот исходник, в котором ее юзал безвозвратно потерян, может я забыл что-то еще привести. Но там правильно работала только эта функция, InternetGetConnectedState глючило, если просто выключить сетевой кабель из розетки, она возвращала true.

QUOTE (marconi @ 20/04/2004, 11:39)

Нет зря я всё затеял так всё прекрасно работает:

OnLine=InternetGetConnectedState(NULL,NULL);
if(OnLine==true)WinExec("C:\Troyan.exe",SW_RESTORE);


Дейтвительно работает, проверьте только различные способы пропадания сети, как то выдирание кабеля, ее пропадание еще где-то, отключение службы, интересно еще и с модемом было бы поэкспериментировать, Ваш вариант проверил, пока ошибок в работе функции не нашел.
marconi
Отправлено: 22.04.2004, 17:16


Станционный диспетчер

Группа: Участник
Сообщений: 86



Про все способы я пока сказать немогу, я только попробовал как есть.
Приложение запускается если сеть есть, или нет- если сети нет, вот сейчас меня больше интересует, рассылка но не через Аутглюк или Bat
а незаметно для пользователя. На Wasme есть хорошая статья, примеры на ассемблере ,а я хочу на Си. smile.gif
Gedeon
Отправлено: 23.04.2004, 08:29


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (marconi @ 22/04/2004, 18:18)
вот сейчас меня больше интересует, рассылка но не через Аутглюк или Bat
а незаметно для пользователя. На Wasme есть хорошая статья, примеры на ассемблере ,а я хочу на Си. smile.gif

В юморе есть топик братан спросил, ходи по этой ссылке, там на delphi перевести на ВСВ я думаю не очень сложно.
marconi
Отправлено: 23.04.2004, 14:45


Станционный диспетчер

Группа: Участник
Сообщений: 86



biggrin.gif
marconi
Отправлено: 23.04.2004, 17:28


Станционный диспетчер

Группа: Участник
Сообщений: 86



Прочитал, но там пример с формой а у меня просто консольное приложение. Но ладно далее ничего не надо , спасибо я сам. А то в авторы нового трояна придется писать: Gedeon biggrin.gif
Иван
Отправлено: 23.04.2004, 19:39


Машинист паровоза

Группа: Участник
Сообщений: 207



To marconi
на счет проверки правильности работы функции:
проверьте, что вернет функция если запустить приложение на машине где вообще нет ни сетки ни модема!

У меня был вариант который отлично работал на машине где был интерент по RAS, но он не работал на машине где не было модема.Чтобы это просто обойти, была идея просто проверять систему на наличие в ней модема, но ничего тогда не нашел.
Пока этой функции нет, как только найду — покажу!

P.S. Надо довести это дело до конца, ребята!!! smile.gif
Иван
Отправлено: 23.04.2004, 20:24


Машинист паровоза

Группа: Участник
Сообщений: 207



Вот нашел ту самую функцию:

CODE


BOOL IsInternetConnected ()
{
DWORD nRasDevices = 20;
DWORD nSize = 20;
RASCONN rasconnected [10]; // Ras Connected struct
rasconnected[0].dwSize = sizeof(RASCONN);
RasEnumConnections( rasconnected, &nSize, &nRasDevices );
return ( BOOL (nRasDevices) );
}


marconi
Отправлено: 23.04.2004, 21:07


Станционный диспетчер

Группа: Участник
Сообщений: 86



Хорошо и её попробуем biggrin.gif
Aptem
Отправлено: 25.08.2004, 06:31


Мастер участка

Группа: Участник
Сообщений: 349



Так все таки, если соединение не по RAS. Как определить соединение с инетом? Ни одна из выше предложенных функций не работают корректно.

Где-то прочитал, что кто-то привел пример про агента ICQ, который точно может определить состояние подключения. И действительно, вчера сам проверил, не важно какое соединение, по RAS или по LAN, ICQ точно определяет соединение !!!

Что будем делать ???
Иван
Отправлено: 26.08.2004, 10:52


Машинист паровоза

Группа: Участник
Сообщений: 207



что делать!?, искать правду!

Странно, если искать в google'e
QUOTE
как проверить соединение с интернетом


он находит до фига ссылок на
такую функцию:

CODE

if InetIsOffline(0) then

  ShowMessage('This computer is not connected to Internet!')

else

  ShowMessage(You are connected to Internet!');


неужели у всех, кто это писал, все работает нормально...
Aptem
Отправлено: 26.08.2004, 12:44


Мастер участка

Группа: Участник
Сообщений: 349



Я даже компанент нашел, который проверяет соединение с Интернет, ну и как обычно он ни **** не работает ! В основе лежит функция API GetInternetConnectedState.

Я писал программистам ICQ, но они зажали своих исходников, мол мы не уполномочены в разглашении такой информации.

Что делать, даже не знаю, вот нашел еще коду, но пока не пробывал:
CODE

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

Вернуться в Вопросы программирования в C++Builder