Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по функции InetIsOffline   Найти похожие ветки 

 
Игорь   (2004-06-15 20:44) [0]

В Дайджест от 19.05.01 03:24 было выложено описание функии InetIsOffline:
******
Как проверить соединение с интернетом. (16.04.01 14:58)
Часто приложению, которое работает в интернете, требуется знать, подключён пользователь к интернету или нет. Предлагаю Вам довольно гибкое решение этого вопроса.
Совместимость: Delphi 3.x (или выше)
Для работы Вам необходимо импортировать функцию InetIsOffline из URL.DLL:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external "URL.DLL";
а затем поместить в программу простой вызов функции для проверки статуса соединения:

if InetIsOffline(0) then    
ShowMessage("This computer is not connected to Internet!")
else    
ShowMessage("You are connected to Internet!");

Эта функция возвращает TRUE если соединение с интернетов отсутствует, или FALSE если соединение установлено.

Замечание:
параметр Flag игнорируется, соответственно используем ноль.
Эта DLL обычно проинсталлирована на большинстве компьютеров. Она также существует в Win98 либо поставляется с Internet Explorer 4 или выше, Office 97 и т.д..
Более подробно можно прочитать в MSDN.
Оригинал: http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/InetIsOffline.htm

Автор: Vitaly Zayko (zayko@vitsoftware.com)
Источник: http://www.sources.ru/delphi/

********

Попробовал в оффлайне. Результат: You are connected to Internet!
Подключился к Интернет. Результат: You are connected to Internet!

Далее попробовал заменить строку "if InetIsOffline(0) then" на "if not InetIsOffline(0)"

получилось все с точностью до наоборот:
в оффлайне: This computer is not connected to Internet!
в онлайне: This computer is not connected to Internet!

В чем смысл функции? Может кто объяснит?


 
Graber   (2004-06-17 02:21) [1]

Насколько я помню эта фцнкция коректно работает только под 98 Виновс.

Я тоде пытался определить подключение к интеренету и к меня не получалось даже под 98.

Можно использовать другой способ например попробовант зделать пинг на любой IP адрес или страничку


 
Cobalt ©   (2004-06-17 23:27) [2]

Такая вот мысль - при соединении с "интернетом" комп должени иметь реальный инетовский адрес (т.е. не адрес сети класса С).
Какие вообще есть методы подключения к "интернету":
1) Через прокси. Реальный Инет-адрес не требуется, т.к. его подставляет прокси-сервер. Но, полноценным соединением назвать это трудно, поскольку для соеджинения надо обязательно уметь работать через прокси.
2) Диалап, или VPN. Тут уже есть собственный сетевой интерфейс (надеюсь, ничего не напутал в терминологии?). Вот тут уже можно искать собственный "не локально-сетевой" адрес.

Что скажите?


 
Graber   (2004-06-18 01:37) [3]

Для проверки соединнения я использовал вот этот код. Функция проверяет наличие соединения с интернетом. Не дает информации о
действительной доступности сетевых ресурсов.
Для проверки доступности реурсов можно воспользоваться функцией CheckURL из
базы UBPFD или функцией CheckInetLink из базы UBPFD, которая выполняет обе
функции.
Функция возвращает
0 - если проверка показала отсутствие связи,
1 - если установлено модемное соединение,
2 - если установлено соединение через прокси.
Функция требует объявления типа в разделе interface модуля:
type ERasError = class(Exception);

function CheckInetConnect:byte;
const
 cERROR_BUFFER_TOO_SMALL = 603;
 cRAS_MaxEntryName = 256;
 cRAS_MaxDeviceName = 128;
 cRAS_MaxDeviceType = 16;
type
 HRASConn = DWord;
 PRASConn = ^TRASConn;
 TRASConn = record
              dwSize: DWORD;
              rasConn: HRASConn;
              szEntryName: array [0..cRAS_MaxEntryName] of Char;
              szDeviceType: array [0..cRAS_MaxDeviceType] of Char;
              szDeviceName: array [0..cRAS_MaxDeviceName] of char;
            end;
 TRasEnumConnections =
   function (RASConn: PrasConn; { buffer to receive Connections data }
             var BufSize: DWord; { size in bytes of buffer }
             var Connections: DWord { number of Connections written to
                                      buffer }
             ): LongInt; stdcall;

//---------------------------------------

function RasConnectionCount : Integer;
var
 RasDLL: HInst;
 Conns: array [1..4] of TRasConn;
 RasEnums: TRasEnumConnections;
 BufSize: DWord;
 NumConns: DWord;
 RasResult: Longint;
begin
Result:= 0;
// Загрузка библиотеки
RasDLL:= LoadLibrary("rasapi32.dll");
if RasDLL = 0 then exit;
try
 RasEnums:= GetProcAddress(RasDLL,"RasEnumConnectionsA");
 if @RasEnums = nil then
   raise ERasError.Create
    ("Ошибка вызова функции RasEnumConnectionsA из rasapi32.dll");
 Conns[1].dwSize:= Sizeof (Conns[1]);
 BufSize:= SizeOf(Conns);
 RasResult:= RasEnums(@Conns, BufSize, NumConns);
 If (RasResult = 0) or (Result = cERROR_BUFFER_TOO_SMALL) then
  Result:=NumConns;
finally
 FreeLibrary(RasDLL);
end;

end;

//---------------------------------------

var
 Reg : TRegistry;
 bUseProxy : Boolean;
 UseProxy : LongWord;

begin
Result:= 0;
Reg:= TRegistry.Create;
with REG do
try
 try
   RootKey:= HKEY_CURRENT_USER;
   if OpenKey("\Software\Microsoft\Windows\CurrentVersion\Internet Settings",
    False) then begin
     // Пробуем прочитать и ловим ошибку
     if GetDataType("ProxyEnable") = rdBinary then
     ReadBinaryData("ProxyEnable", UseProxy, SizeOf(LongWord)) else
     begin
       bUseProxy:= ReadBool("ProxyEnable");
       if bUseProxy then UseProxy:= 1 else UseProxy:= 0;
     end;
     if (UseProxy <> 0) and (ReadString("ProxyServer") <> "" ) then Result:= 2;
   end;
 except
   // Вероятно, нет связи через прокси
 end;
finally
Free;
end;
// Мы можем проверять(отмечать) RasConnectionCount, даже если работа с сетями
// телефонного вызова не установлена просто, потому что это возвратится 0,
// если DLL не найден.
if Result = 0 then
begin
 if RasConnectionCount > 0 then Result:= 1;
end;

end;

Удачи!!!



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.029 c
3-1090486803
ZedeS
2004-07-22 13:00
2004.08.15
Номер строки в DBGrid


4-1089118392
Wistler
2004-07-06 16:53
2004.08.15
Работа с пользователями в домене WinNT


1-1091462197
GuAV
2004-08-02 19:56
2004.08.15
Что лучше применить - отдельный Thread или ProcessMessages?


1-1091215797
Алхимик
2004-07-30 23:29
2004.08.15
InputQuery


1-1091454495
Dysan
2004-08-02 17:48
2004.08.15
почему возникает ошибка...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский