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
|
так я много раз пробовал
уже не знаю что еще пробовать ,
хотя была мысль, что что-то с машиной не то!
или функция работает не так как хотелось бы
P.S. ту тему как раз я то и начинал!
Отредактировано Иван — 18/04/2004, 05:25
|
|
Иван |
Отправлено: 18.04.2004, 02:19 |
|
Машинист паровоза
Группа: Участник
Сообщений: 207
|
Вот наткнулся на ссылку от Gedeon,
InternetCheckConnection()
Как говорит GedeonQUOTE | кусок кода который я использую для проверки, работает наиболее правдиво из всего, что я перепробовал |
Ну что проверю дома,скажу свое мнение.
Отредактировано Иван — 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
|
Спасибо за ссылки , вот только времени нет пока попробовать,
тут навигация открывается, на Каме лёд сходит, параходы котлы растапливают.
|
|
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);
Так не работает или не так? Я хочу что бы при наличии инета, запускалось моё приложение.
Отредактировано marconi — 19/04/2004, 21:20
|
|
marconi |
Отправлено: 19.04.2004, 20:29 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Приложение запускается постоянно независимо от наличия сети.
Я скорее всего чепуху написал.
но и так не работает:
if (OnLine=true)WinExec("C:\Troyan.exe",SW_RESTORE);
|
|
Иван |
Отправлено: 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);
|
|
Иван |
Отправлено: 21.04.2004, 20:28 |
|
Машинист паровоза
Группа: Участник
Сообщений: 207
|
Вот блин, опять этот "Unresolved external'InternetGetConnectedState' ..."
Кто-нибудь, объясните пожалуйста еще раз : в каких случаях возникает данная ошибка и как от нее избавиться.
Отредактировано Иван — 21/04/2004, 21:32
|
|
Gedeon |
Отправлено: 22.04.2004, 09:04 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Иван @ 21/04/2004, 21:30) | Вот блин, опять этот "Unresolved external'InternetGetConnectedState' ..."
|
Для лечения ошибки в этом случае включите 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 есть хорошая статья, примеры на ассемблере ,а я хочу на Си.
|
|
Gedeon |
Отправлено: 23.04.2004, 08:29 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (marconi @ 22/04/2004, 18:18) | вот сейчас меня больше интересует, рассылка но не через Аутглюк или Bat
а незаметно для пользователя. На Wasme есть хорошая статья, примеры на ассемблере ,а я хочу на Си. |
В юморе есть топик братан спросил, ходи по этой ссылке, там на delphi перевести на ВСВ я думаю не очень сложно.
|
|
marconi |
Отправлено: 23.04.2004, 14:45 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
|
|
marconi |
Отправлено: 23.04.2004, 17:28 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Прочитал, но там пример с формой а у меня просто консольное приложение. Но ладно далее ничего не надо , спасибо я сам. А то в авторы нового трояна придется писать: Gedeon
|
|
Иван |
Отправлено: 23.04.2004, 19:39 |
|
Машинист паровоза
Группа: Участник
Сообщений: 207
|
To marconi
на счет проверки правильности работы функции:
проверьте, что вернет функция если запустить приложение на машине где вообще нет ни сетки ни модема!
У меня был вариант который отлично работал на машине где был интерент по RAS, но он не работал на машине где не было модема.Чтобы это просто обойти, была идея просто проверять систему на наличие в ней модема, но ничего тогда не нашел.
Пока этой функции нет, как только найду — покажу!
P.S. Надо довести это дело до конца, ребята!!!
|
|
Иван |
Отправлено: 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
|
Хорошо и её попробуем
|
|
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{
// ошибка
}
|
|
|