Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проверить соединение с Интернетом и узнать тип соединения

Delphi , Интернет и Сети , Интернет

Проверить соединение с Интернетом и узнать тип соединения


Директору пивзавода от группы программистов. Заявление: "Просим Вас предоставить выделенную линию со скоростью 0,5 л/сек."

По нажатию на кнопку в появляется сообщение. Если не 0 - есть соединения с Интернетом. А в заголовке формы показывается тип соединения.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Registry, WinSock, WinInet, StdCtrls;

type
  TConnectionType = (ctNone, ctProxy, ctDialup);

function ConnectedToInternet : TConnectionType;
function RasConnectionCount : Integer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//For RasConnectionCount =======================
const
  cERROR_BUFFER_TOO_SMALL = 603;
  cRAS_MaxEntryName = 256;
  cRAS_MaxDeviceName = 128;
  cRAS_MaxDeviceType = 16;

type
  ERasError = class(Exception);
    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;
//End RasConnectionCount =======================

function ConnectedToInternet: TConnectionType;
var
  Reg : TRegistry;
  bUseProxy : Boolean;
  UseProxy : LongWord;
begin
  Result := ctNone;
  Reg := TRegistry.Create;
  with REG do
    try
      try
        RootKey := HKEY_CURRENT_USER;
        if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Internet settings',False) then
        begin
          //I just try to read it, and trap an exception
          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 := ctProxy;
        end;
      except
      //Obviously not connected through a proxy
      end;
    finally
      Free;
    end;

  //We can check RasConnectionCount even if dialup networking is not installed
  //simply because it will return 0 if the DLL is not found.
  if Result = ctNone then
  begin
    if RasConnectionCount > 0 then
      Result := ctDialup;
  end;
end;

function RasConnectionCount : Integer;
var
  RasDLL : HInst;
  Conns : array[1..4] of TRasConn;
  RasEnums : TRasEnumConnections;
  BufSize : DWord;
  NumConns : DWord;
  RasResult : Longint;
begin
  Result := 0;

  //Load the RAS DLL
  RasDLL := LoadLibrary('rasapi32.dll');
  if RasDLL = 0 then
    exit;

  try
    RasEnums := GetProcAddress(RasDLL,'RasEnumConnectionsA');
  if @RasEnums = nil then
    raise ERasError.Create('RasEnumConnectionsA not found in 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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(RasConnectionCount));
  if ConnectedToInternet=ctNone then
    Form1.Caption:='ctNone';
  if ConnectedToInternet=ctProxy then
    Form1.Caption:='ctProxy';
  if ConnectedToInternet=ctDialup then
    Form1.Caption:='ctDialup';
end;

end.

Программа на Delphi для проверки наличия интернет-соединения и его типа (прокси, dial-up или отсутствие).

В функции ConnectedToInternet используются два метода:

  1. Чтение реестровой ключа HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet settings\ProxyEnable для определения включения настройки прокси-сервера.
  2. Если настройка прокси-сервера включена, функция проверяет, указан ли прокси-сервер.

Если обе условия истинны, результат устанавливается в ctProxy. Если нет, функция проверяет наличие dial-up соединения с помощью функции RasConnectionCount.

В функции RasConnectionCount используется следующий алгоритм:

  1. Загрузка библиотеки RAS API (rasapi32.dll) и получение указателя на функцию RasEnumConnectionsA.
  2. Размещение массива TRasConn (каждый элемент представляет собой соединение RAS) и установка его размера в 4 (арбитрарное значение, но оно должно быть достаточным).
  3. Вызов функции RasEnumConnectionsA с выделенным буфером и получение количества соединений, записанных в него (NumConns).
  4. Если функция возвращает успешно или ошибку, указывающую на то, что буфер был слишком маленьким (cERROR_BUFFER_TOO_SMALL), результат устанавливается в количество соединений.

В процедуре Button1Click происходит следующее:

  1. Показ сообщения с результатом RasConnectionCount.
  2. Обновление заголовка формы на основе результата ConnectedToInternet.

Обратите внимание, что код использует компонент Delphi для работы с реестром (TRegistry) для чтения и записи значений реестра.

Кроме того, в коде используются исключение ERasError для ловли ошибок при загрузке библиотеки RAS API или вызове функции RasEnumConnectionsA. Функция FreeLibrary используется для освобождения выделенной памяти библиотекой RAS API.

В целом, это базовый способ проверки наличия интернет-соединения и его типа. Однако необходимо учитывать, что код может не работать в некоторых сценариях (например, VPN-соединениях).

Проверить соединение с Интернетом и узнать тип соединения, используя функции Windows API и динамически загружаемый модуль RASAPI32.DLL.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:50:06/0.0056788921356201/1