Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить подключён ли комп. к интернету? Билдер 
:(
    Опции темы
bercut
Дата 16.10.2002, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 15.8.2002
Где: Волжский

Репутация: нет
Всего: нет



В папке, где установлен у тебя C++Builder5 есть пример отслеживания процессов и их уничтожения. Вот эта папочка с примером, надеюсь разберешься:
\Examples\Apps\Procview\
PM MAIL WWW ICQ   Вверх
Vit
Дата 16.10.2002, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Модератор: Не надо превращать тему во флейм. Здесь обсуждается тема "Как определить подключён ли комп. к интернету?", для обсуждения других тем делайте другие топики. Ещё один офтоп и тема будет закрыта.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
bercut
Дата 16.10.2002, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 15.8.2002
Где: Волжский

Репутация: нет
Всего: нет



Модератор: Удалено как не относящееся к теме обсуждения.


PM MAIL WWW ICQ   Вверх
Baa
Дата 16.10.2002, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Флейм начался с пятого сообщения! Снятие задач не относится к вопросу: подключен ли комп к инету.




--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
bercut
Дата 17.10.2002, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 15.8.2002
Где: Волжский

Репутация: нет
Всего: нет



Модератор: Удалено как не относящееся к теме обсуждения.


PM MAIL WWW ICQ   Вверх
Baa
Дата 17.10.2002, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



Если у человека есть 10 вопросов, то пусть он создает 10 тем.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Klin
  Дата 17.10.2002, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: нет
Всего: 25



Модератор: Удалено как не относящееся к теме обсуждения.

PS. Обсудить форум и действия модераторов можно здесь:
http://www.forum.vingrad.ru/cgi-bin....SF;f=27





--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Klin
  Дата 17.10.2002, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: нет
Всего: 25



Модератор: Удалено как не относящееся к теме обсуждения.




--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
neutrino
Дата 17.10.2002, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 1
Всего: 62



Модератор: Удалено как не относящееся к теме обсуждения.




--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Vit
Дата 17.10.2002, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



По существу вопроса - для Билдера должна быть библиотека RasAPI- там есть функции для определения коннекта к интернету, но они работают только для модемного соединения. Во всех остальных случаях есть только 1 надёжный способ - попытаться загрузить web страничку с www.yahoo.com или www.microsoft.com или что-то типа этого. Почему так? Да просто потому что если мой комп стоит в локалке и подсоединён к прокси и к локальным Web серверам то операционная система искренне считает что она в интернете, даже если реального коннекта с остальным миром нет. Ping внешнего сервера как я выяснил не очень хорошо подходит, так как многие сервера и firewall запрещают протокол Ping - попробуйте например пропинговать:

Ping www.microsoft.com - и получите timeout на все запросы.

Следовательно лучше всего просто попытаться скачать страничку (на Билнере это легко можно сделать используя NMHTTP компонент). Однако и в данном случае возможны проблемы: например я могу поставить Firewall и прокси таким образом что доступ будет только, например, к домену Yahoo.com или например только к доменам находящимся на территории Гвинеи - как в этом случае считать есть интернет или нет? - очевидно что есть, но только толку от этого скорее всего буден немного. Следовательно мой ответ будет такой:

1) Если модемное соединение используйте модуль RasAPI
2) Если соединение неизвестно - пытайтесь скачать заведомо известо существующий сервер - лучше всего свой собственный - тут вы можете даже проверить корректность ответа - вы точно знаете что именно вы должны получить по запросу.
3) Не обольщатся и понимать что 100% корректного решения проблемы нет, так как само понятие интернет растяжимое, и наличие доступа к некоторым серверам еще не означает наличия выхода на все сервера. Следовательно проблему доступа надо решать не для доступа к "интернету", а "есть ли доступ к конкретному, нужному вам серверу".


Чуть не забыл - проксисервер, Gateway и DNS сервер могут быть перенастроены очень даже хитро - возможно настроить так что Ping будет проходить на любой IP (просто firewall будет его ретранслировать на один и тот же адрес) и в ответ на запрос любой страницы Proxi будет выдавать одну и ту же страницу или какую-то свою страницу - причём без всяких ошибок! Поэтому наряду со скачиванием страницы с известного стабильного сервера желательна проверка контента - действительно ли он содержит ожидаемую страницу. Поэтому желательно пользоваться скачиванием со своего сервера - тогда вы точно знаете что надо ожидать в ответ.




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
bercut
  Дата 17.10.2002, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 15.8.2002
Где: Волжский

Репутация: нет
Всего: нет



Вот исходный код Ping'a

//
// PingI.c -- Simple ping program using the proprietary
//  Microsoft ICMP API
//

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

typedef struct tagIPINFO
{
u_char Ttl; // Time To Live
u_char Tos; // Type Of Service
u_char IPFlags; // IP flags
u_char OptSize; // Size of options data
u_char FAR *Options; // Options data buffer
}IPINFO, *PIPINFO;

typedef struct tagICMPECHO
{
u_long Source; // Source address
u_long Status; // IP status
u_long RTTime; // Round trip time in milliseconds
u_short DataSize; // Reply data size
u_short Reserved; // Unknown
void FAR *pData; // Reply data buffer
IPINFO ipInfo; // Reply options
}ICMPECHO, *PICMPECHO;


// ICMP.DLL Export Function Pointers
HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD (WINAPI *pIcmpSendEcho)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);

//
//
void main(int argc, char **argv)
{
WSADATA wsaData; // WSADATA
ICMPECHO icmpEcho; // ICMP Echo reply buffer
HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL
HANDLE hndlFile; // Handle for IcmpCreateFile()
   LPHOSTENT pHost; // Pointer to host entry structure
   struct in_addr iaDest; // Internet address structure
DWORD *dwAddress; // IP Address
IPINFO ipInfo; // IP Options structure
int nRet; // General use return code
DWORD dwRet; // DWORD return code
int x;

// Check arguments
if (argc != 2)
{
fprintf(stderr,"\nSyntax: pingi HostNameOrIPAddress\n");
return;
}

// Dynamically load the ICMP.DLL
hndlIcmp = LoadLibrary("ICMP.DLL");
if (hndlIcmp == NULL)
{
fprintf(stderr,"\nCould not load ICMP.DLL\n");
return;
}
// Retrieve ICMP function pointers
pIcmpCreateFile = (HANDLE (WINAPI *)(void))
GetProcAddress(hndlIcmp,"IcmpCreateFile");
pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
GetProcAddress(hndlIcmp,"IcmpCloseHandle");
pIcmpSendEcho = (DWORD (WINAPI *)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
GetProcAddress(hndlIcmp,"IcmpSendEcho");
// Check all the function pointers
if (pIcmpCreateFile == NULL ||
pIcmpCloseHandle == NULL ||
pIcmpSendEcho == NULL)
{
fprintf(stderr,"\nError getting ICMP proc address\n");
FreeLibrary(hndlIcmp);
return;
}

// Init WinSock
nRet = WSAStartup(0x0101, &wsaData );
   if (nRet)
   {
       fprintf(stderr,"\nWSAStartup() error: %d\n", nRet);
       WSACleanup();
FreeLibrary(hndlIcmp);
       return;
   }
   // Check WinSock version
   if (0x0101 != wsaData.wVersion)
   {
       fprintf(stderr,"\nWinSock version 1.1 not supported\n");
       WSACleanup();
FreeLibrary(hndlIcmp);
       return;
   }

// Lookup destination
   // Use inet_addr() to determine if we're dealing with a name
   // or an address
   iaDest.s_addr = inet_addr(argv[1]);
   if (iaDest.s_addr == INADDR_NONE)
       pHost = gethostbyname(argv[1]);
   else
       pHost = gethostbyaddr((const char *)&iaDest,
                       sizeof(struct in_addr), AF_INET);
if (pHost == NULL)
{
fprintf(stderr, "\n%s not found\n", argv[1]);
       WSACleanup();
FreeLibrary(hndlIcmp);
return;
}

// Tell the user what we're doing
printf("\nPinging %s [%s]", pHost->h_name,
inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0])));

// Copy the IP address
dwAddress = (DWORD *)(*pHost->h_addr_list);

// Get an ICMP echo request handle        
hndlFile = pIcmpCreateFile();
for (x = 0; x < 4; x++)
{
// Set some reasonable default values
ipInfo.Ttl = 255;
ipInfo.Tos = 0;
ipInfo.IPFlags = 0;
ipInfo.OptSize = 0;
ipInfo.Options = NULL;
//icmpEcho.ipInfo.Ttl = 256;
// Reqest an ICMP echo
dwRet = pIcmpSendEcho(
hndlFile, // Handle from IcmpCreateFile()
*dwAddress, // Destination IP address
NULL, // Pointer to buffer to send
0, // Size of buffer in bytes
&ipInfo, // Request options
&icmpEcho, // Reply buffer
sizeof(struct tagICMPECHO),
5000); // Time to wait in milliseconds
// Print the results
iaDest.s_addr = icmpEcho.Source;
printf("\nReply from %s  Time=%ldms  TTL=%d",
inet_ntoa(iaDest),
icmpEcho.RTTime,
icmpEcho.ipInfo.Ttl);
if (icmpEcho.Status)
{
printf("\nError: icmpEcho.Status=%ld",
icmpEcho.Status);
break;
}
}
printf("\n");
// Close the echo request file handle
pIcmpCloseHandle(hndlFile);
FreeLibrary(hndlIcmp);
WSACleanup();
}
PM MAIL WWW ICQ   Вверх
Klin
  Дата 18.10.2002, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: нет
Всего: 25



Спасибо, bercut.
Тема-закрыта!


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
NebelDT
Дата 29.9.2008, 12:15 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.9.2008
Где: RU

Репутация: -1
Всего: -10



Пропинговать - это хорошая идея, можно еше и проверить наличие загруженных служб или exe))... 
PM MAIL WWW YIM   Вверх
xvr
Дата 30.9.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(NebelDT @ 29.9.2008,  12:15)
Пропинговать - это хорошая идея, можно еше и проверить наличие загруженных служб или exe))...

NebelDT а ты не хочешь 3е образование получить? Врача - реаниматора  smile Пара десятков поднятых топиков выдержки от 2х месяцев и более, но это явно хит - 6 ЛЕТНЯЯ ТЕМА!  smile 
PM MAIL   Вверх
Alca
Дата 1.10.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Как определить тип подключения к сети при помощи InternetGetConnectedState

Автор: Paul Marshal
Компилятор: Visual Basic
API функция InternetGetConnectedState содержится в wininet.dll (IE4 / IE5) и показывает состояние подключения к сети локальной системы. Она довольно проста в использовании и возвращает TRUE, если присутствует соединение с интернетом, иначе FALSE.
Так же функция содержит параметр dwFlags. После вызова функции, dwFlags содержит состояние текущего соединения.

Добавьте следующий код в секцию объявлений модуля BAS:

Код

Option Explicit
Public Declare Function InternetGetConnectedState Lib "wininet" _
  (ByRef dwFlags As Long, _
   ByVal dwReserved As Long) As Long

'Для соединения с интернетом используется модем.
Public Const INTERNET_CONNECTION_MODEM As Long = &H1

'Для соединения с интернетом используется LAN.
Public Const INTERNET_CONNECTION_LAN As Long = &H2

'Для соединения с интернетом используется прокси сервер.
Public Const INTERNET_CONNECTION_PROXY As Long = &H4

'No longer used.
Public Const INTERNET_CONNECTION_MODEM_BUSY As Long = &H8

Public Const INTERNET_RAS_INSTALLED As Long = &H10
Public Const INTERNET_CONNECTION_OFFLINE As Long = &H20
Public Const INTERNET_CONNECTION_CONFIGURED As Long = &H40

'Следующие функции содержат в себе вызов InternetGetConnectedState
Public Function IsNetConnectViaLAN() As Boolean
   Dim dwflags As Long
   
  'передаём пустую переменную в функцию, чтобы
  'получить состояние флагов, отвечающих за соединение
   Call InternetGetConnectedState(dwflags, 0&)

  'возвращаем True если флаги указывают на соединение по LAN
   IsNetConnectViaLAN = dwflags And INTERNET_CONNECTION_LAN
End Function


Public Function IsNetConnectViaModem() As Boolean
   Dim dwflags As Long
   
  'передаём пустую переменную в функцию, чтобы
  'получить состояние флагов, отвечающих за соединение
   Call InternetGetConnectedState(dwflags, 0&)

  'возвращаем True если флаги указывают на соединение по модему
   IsNetConnectViaModem = dwflags And INTERNET_CONNECTION_MODEM
End Function


Public Function IsNetConnectViaProxy() As Boolean
   Dim dwflags As Long
   
  'передаём пустую переменную в функцию, чтобы
  'получить состояние флагов, отвечающих за соединение
   Call InternetGetConnectedState(dwflags, 0&)

  'возвращаем True если флаги указывают на соединение через проксю
   IsNetConnectViaProxy = dwflags And INTERNET_CONNECTION_PROXY
End Function


Public Function IsNetConnectOnline() As Boolean
  'здесь не нужно флагов - функция вернёт True если
  'присутствует соединие с интернетом любого типа
   IsNetConnectOnline = InternetGetConnectedState(0&, 0&)
End Function


Public Function IsNetRASInstalled() As Boolean
   Dim dwflags As Long
   
  'передаём пустую переменную в функцию, чтобы
  'получить состояние флагов, отвечающих за соединение
   Call InternetGetConnectedState(dwflags, 0&)

  'возвращаем True если флаги показывают, что RAS установлен
   IsNetRASInstalled = dwflags And INTERNET_RAS_INSTALLED
End Function


Public Function GetNetConnectString() As String
   Dim dwflags As Long
   Dim msg As String

  'составляем строку для отображения
   If InternetGetConnectedState(dwflags, 0&) Then
     
      If dwflags And INTERNET_CONNECTION_CONFIGURED Then
         msg = msg & "You have a network connection configured." & vbCrLf
      End If

      If dwflags And INTERNET_CONNECTION_LAN Then
         msg = msg & "The local system connects to the Internet via a LAN"
      End If
      
      If dwflags And INTERNET_CONNECTION_PROXY Then
            msg = msg & ", and uses a proxy server. "
      Else: msg = msg & "."
      End If
      
      If dwflags And INTERNET_CONNECTION_MODEM Then
         msg = msg & "The local system uses a modem to connect to the Internet. "
      End If
      
      If dwflags And INTERNET_CONNECTION_OFFLINE Then
         msg = msg & "The connection is currently offline. "
      End If
      
      If dwflags And INTERNET_CONNECTION_MODEM_BUSY Then
         msg = msg & "The local system's modem is busy with a non-Internet connection. "
      End If
      
      If dwflags And INTERNET_RAS_INSTALLED Then
         msg = msg & "Remote Access Services are installed on this system."
      End If
      
   Else
    
      msg = "Not connected to the internet now."
      
   End If
   
   GetNetConnectString = msg
End Function


Добавьте на форму кнопку (Command1), шесть текстовых полей (Text1 - Text6). Установите в Text6 свойство Multiline в True и добавьте следующий код:
Код

Private Sub Command1_Click()
   Text1.Text = IsNetConnectViaLAN()
   Text2.Text = IsNetConnectViaModem()
   Text3.Text = IsNetConnectViaProxy()
   Text4.Text = IsNetConnectOnline()
   Text5.Text = IsNetRASInstalled()
   Text6.Text = GetNetConnectString()
End Sub



--------------------
PM WWW ICQ Skype Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1201 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.