Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Отслеживание подключения в сети


Автор: razumsap 8.1.2008, 17:18
У нас часто пропадает инет на работе, хотелось бы написать программу, которая показывала наличие подключения (графически). Подскажите пожалуйста функцию или ещё что-нибуд, желательно чтоб можно было реализовать на Делфи 6. Или может кто уже сделал такую программу - поделитесьsmile

Автор: tommy256 8.1.2008, 18:18
А что будет показываться на графике, On or Off? smile
Можно просто без графика, например если инет пашет, то кнопочка зелёная, если нет то красная
Посмотри в drkb, там есть похожее

Автор: Yanis 8.1.2008, 18:23
razumsap
Пингуй Яндекс.

Автор: remax 8.1.2008, 20:01
примерно так

Код

uses WinInet;

function TFrmMain.IsConnectedToInternet: Boolean;
 var
   dwConnectionTypes: DWORD;
 begin
   try
   dwConnectionTypes :=
     INTERNET_CONNECTION_MODEM +
     INTERNET_CONNECTION_LAN +
     INTERNET_CONNECTION_PROXY;
   Result := InternetGetConnectedState(@dwConnectionTypes, 0);
   except
        result:=false;
   end;
 end;


Автор: Alexeis 8.1.2008, 20:10
Цитата(Yanis @  8.1.2008,  17:23 Найти цитируемый пост)
Пингуй Яндекс. 

лучше гугл, так надежнее.

Автор: remax 8.1.2008, 21:08
Да, возможно использования только InternetGetConnectedState будет мало.
В MSDN написано следующее: 

"You cannot rely solely on the fact that InternetGetConnectedState returning TRUE means that you have a valid active Internet connection. It is impossible for InternetGetConnectedState to determine if the entire connection to the Internet is functioning without sending a request to a server. This is why you need to send a request to determine if you are really connected or not. You can be assured however that if InternetGetConnectedState returns TRUE, that attempting your connection will NOT cause you to be prompted to connect to the default Internet Service Provider." 

т.е.
Вы не можете полагаться только на тот факт, что если функция InternetGetConnectedState возвращает TRUE, это означает наличие активного соединения с Интернет. InternetGetConnectedState не может определить, функционирует ли соединение с Интернет без обращения к серверу...

Для полной проверки надо будет еще пингануть. Т.е. первым пунктом используем InternetGetConnectedState, а затем если TRUE, пробуем пинговать.


Для этого необходимо использовать протокол ICMP: утилиты ping, traceroute; (так мы узнаем о  доступности какого-либо узла). Ключевые фунции - IcmpSendEcho() (реализована в ICMP.DLL), InternetCheckConnection() (реализована в WININET.DLL)

Автор: Yanis 8.1.2008, 22:45
Цитата(Alexeis @  8.1.2008,  21:10 Найти цитируемый пост)
лучше гугл, так надежнее. 

И то верно.

Добавлено через 21 секунду
Цитата(remax @  8.1.2008,  22:08 Найти цитируемый пост)
Вы не можете полагаться только на тот факт, что если функция InternetGetConnectedState возвращает TRUE, это означает наличие активного соединения с Интернет. InternetGetConnectedState не может определить, функционирует ли соединение с Интернет без обращения к серверу...

О том и речь smile

Автор: remax 8.1.2008, 23:22
Цитата(Yanis @  8.1.2008,  22:45 Найти цитируемый пост)
О том и речь smile 


Да, для полноценной проверки и этого может быть недостаточно. Автор темы четко не определил понятие "пропал Интернет". Поэтому, как положено - от простого к сложного. Начать с InternetGetConnectedState. Если этого будет недостаточно - IcmpSendEcho(), InternetCheckConnection(). Если этого будет мало, тогда будем думать дальше. Надо решать проблемы по мере поступления!

Добавлено через 3 минуты и 1 секунду
В своих прогах, работающих с интернетом, мне обычно хватает  InternetGetConnectedState. И, как не странно, пока сбоев не было... Хотя сама Микрософт ничего не гарантирует.

Автор: razumsap 9.1.2008, 09:51
Спасибо всем за помощь.
Да хотелось бы всего ничего, чтоб показывался индикатор On or Off. 
Вот с утра попробовал InternetGetConnectedState всё время возвращяет true.
Цитата

Да, для полноценной проверки и этого может быть недостаточно. Автор темы четко не определил понятие "пропал Интернет". Поэтому, как положено - от простого к сложного. Начать с InternetGetConnectedState. Если этого будет недостаточно - IcmpSendEcho(), InternetCheckConnection(). Если этого будет мало, тогда будем думать дальше. Надо решать проблемы по мере поступления!

Попробую воспользоваться выше приведенными советами.

Программу написал, но что-то она ругается

Использовал материал http://www.realcoding.net/article/view/251 Реализация ping с помощью ICMP API, после выполнения кода

Код

pHostEn := gethostbyname('http://www.google.com.ua/');
error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf('Error in call to'+
'gethostbyname().');
Memo1.Lines.Add('Error code: '+IntToStr(error));
Exit;


выдает сообщение в мемо

Error in call togethostbyname().
Error code: 11001

Написал просто
Код


procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
  var result:integer;
begin
result:=AReplyStatus.MsRoundTripTime;
if result <> 0 then
        begin
        Image1.Visible:=true;
        Image2.Visible:=false;
        end
      else
      begin
        Image1.Visible:=false;
        Image2.Visible:=true;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Self.IdIcmpClient1.Host:='209.85.135.147';
Self.IdIcmpClient1.Ping;
end;

end.



Автор: remax 10.1.2008, 00:48
Попробуй такой вариант:

Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses WinInet;

function checkURL(aURL:string):boolean;
var
  hSession,hFile,hRequest:hInternet;
  dcInd,dcLen:dword;
  dc:array [1..20] of char;
  rs:pchar;
begin
  Result:=false;
  hSession:=InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  if Assigned(hSession) then
    begin
      hFile:=InternetOpenUrl(hSession,PChar(aURL), nil,0,INTERNET_FLAG_RELOAD, 0);
      dcInd:=0;
      dcLen:=10;
      HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE, @dc, dcLen, dcInd);
      rs:=PChar(@dc);
      Result:=(rs='200');
      if Assigned(hFile) then InternetCloseHandle(hFile);
      InternetCloseHandle(hSession)
    end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if checkURL('http://google.com')
    then panel1.Color:=clGreen
    else panel1.Color:=clRed
end;

end.



Необходимые пояснения - 
программа проверяет существование определенного адреса в сети. По рекомендациям участников дискуссии - это  http://google.com  smile 

Проверка инициируется таймером. Визуализация - изменение цвета панели. 
Если все ок  smile  - цвет зеленый. Если красный, то значит либо нет инета  smile   либо гугля  smile , что маловероятно... 


Только в таймере поставь не меньше минуты.

Автор: razumsap 10.1.2008, 16:33
Написал программу, а она ругается, выдает ошибку 
---------------------------
Socket Error # 11001
---------------------------
что соответсвует  IP_BUF_TOO_SMALL
где мальнький буфер и как его увеличить?

вобщем, админ наш сказал, что пинг не проходит, по причине того, что мы(наша ОАО) работаем  через 2 прокси и сказал такое Киска не выпустит за пределы интранета smile 

Автор: Rennigth 10.1.2008, 17:03
razumsap, 
нет, это озночает что сервер не найден.
Вот немного поправленны вариант:
Код

function checkURL(aURL:string):boolean;
var
  hSession,hFile,hRequest: hInternet;
  dcInd,dcLen:dword;
  dc:array [1..20] of char;
  rs:pchar;
begin
  Result := False;
  ZeroMemory(@dc, 20);
  hSession := InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  if Assigned(hSession) then
  begin
    hFile := InternetOpenUrl(hSession, PChar(aURL), nil, 0, INTERNET_FLAG_RELOAD, 0);
    if Assigned(hFile) then
    begin
      dcInd:=0;
      dcLen:=10;
      HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE, @dc, dcLen, dcInd);
      rs := PChar(@dc);
      Result := (rs='200');
      InternetCloseHandle(hFile);
    end;
    InternetCloseHandle(hSession);
  end;
end;

procedure TForm24.FormCreate(Sender: TObject);
begin
  if checkURL('http://www.google.ru/') then
    Color := clGreen
  else
    Color := clRed;
end;



Добавлено через 46 секунд
razumsap, 
можно было бы и самому заметить что хухл неправильно написан smile

Добавлено через 1 минуту и 55 секунд
если есть прокся, работать не будет, нужно будет дописывать аутентификацию.

Автор: remax 10.1.2008, 21:54
Цитата(Rennigth @  10.1.2008,  17:03 Найти цитируемый пост)

можно было бы и самому заметить что хухл неправильно написан

Интересно, с каких пор http://google.com это неправильно?

У меня, например, все нормально сработало. Причем, вернуло именно 200, а не какой либо другой код.

Автор: remax 10.1.2008, 22:12
Пример автоматического определения параметров прокси (кусок моей рабочей проги)

Код

  procedure TfrmMain.AvtoProxy;
var
  proxyinfo: pinternetproxyinfo;
  len: longword;
  use_proxyserver:boolean;
begin
  len := 4096;
  use_proxyserver:=false;
  getmem(proxyinfo, len);
  try
    if internetqueryoption(nil, internet_option_proxy, proxyinfo, len) then
      if proxyinfo^.dwaccesstype = internet_open_type_proxy then
        begin
          use_proxyserver := true;
          cbPROXY_SERV.Text:=proxyinfo^.lpszproxy;
          if  pos(':',cbPROXY_SERV.Text)>0
            then
              begin
                try
                  cbPROXY_PORT.Text:=trim(copy(cbPROXY_SERV.Text,pos(':',cbPROXY_SERV.Text)+1,5));
                except
                  cbPROXY_PORT.Text:='3128';
                end;
                cbPROXY_SERV.Text:=copy(cbPROXY_SERV.Text,1,pos(':',cbPROXY_SERV.Text)-1);
              end
            else cbPROXY_PORT.Text:='3128';

          update;
        end
  finally
     freemem(proxyinfo);
  end;
  cbProxyEnabled.Checked:= use_proxyserver;
  Update;
end;



Добавлено через 5 минут и 1 секунду
Rennigth, твои изменения изменили логику работы проги. Весь смысл - периодический опрос. А в твоей модификации - только  FormCreate?

Добавлено через 7 минут и 17 секунд
razumsap, а в самом деле, чего мы мучаемся - посмотри в настройках своего броузера - есть явное указание прокси или нет?

Добавлено через 13 минут и 12 секунд
Цитата(razumsap @  10.1.2008,  16:33 Найти цитируемый пост)
вобщем, админ наш сказал, что пинг не проходит, по причине того, что мы(наша ОАО) работаем  через 2 прокси 

А админ не сказал причину регулярного отсутствия интернета? Может дело в выключении каких то рутеров или проксей? И пинговать достаточно их, или те же ваши прокси?

Автор: Rennigth 10.1.2008, 23:23
Цитата(remax @  10.1.2008,  21:54 Найти цитируемый пост)
Интересно, с каких пор http://google.com это неправильно?
Наверное от настроек зависит, разбираться лень но у меня так не работает smile


Цитата(remax @  10.1.2008,  22:12 Найти цитируемый пост)
Rennigth, твои изменения изменили логику работы проги. Весь смысл - периодический опрос. А в твоей модификации - только  FormCreate?

дык я только тестировал, а в таймере функция будет вызываться или нет это я думаю уже автору топика решать. А изменение это зануление dc, т.к. если HttpQueryInfo выполниться неудачно, то вdc останеться тотже мусор что и при инициялизации, и есть шанс(хоть и мизерный) что там будет значение 200 и функция вернет в итоге True smile


Автор: remax 10.1.2008, 23:32
Цитата(Rennigth @  10.1.2008,  23:23 Найти цитируемый пост)
А изменение это зануление dc, т.к. если HttpQueryInfo выполниться неудачно, то вdc останеться тотже мусор что и при инициялизации, и есть шанс(хоть и мизерный) что  там будет значение 200 и функция вернет в итоге True smile

Хуже не будет  smile , хотя и маловероятно.... smile 

Автор: razumsap 11.1.2008, 10:11
Цитата(remax @ 10.1.2008,  22:12)
Пример автоматического определения параметров прокси (кусок моей рабочей проги)

Код

  procedure TfrmMain.AvtoProxy;
var
  proxyinfo: pinternetproxyinfo;
  len: longword;
  use_proxyserver:boolean;
begin
  len := 4096;
  use_proxyserver:=false;
  getmem(proxyinfo, len);
  try
    if internetqueryoption(nil, internet_option_proxy, proxyinfo, len) then
      if proxyinfo^.dwaccesstype = internet_open_type_proxy then
        begin
          use_proxyserver := true;
          cbPROXY_SERV.Text:=proxyinfo^.lpszproxy;
          if  pos(':',cbPROXY_SERV.Text)>0
            then
              begin
                try
                  cbPROXY_PORT.Text:=trim(copy(cbPROXY_SERV.Text,pos(':',cbPROXY_SERV.Text)+1,5));
                except
                  cbPROXY_PORT.Text:='3128';
                end;
                cbPROXY_SERV.Text:=copy(cbPROXY_SERV.Text,1,pos(':',cbPROXY_SERV.Text)-1);
              end
            else cbPROXY_PORT.Text:='3128';

          update;
        end
  finally
     freemem(proxyinfo);
  end;
  cbProxyEnabled.Checked:= use_proxyserver;
  Update;
end;



Добавлено @ 22:17
Rennigth, твои изменения изменили логику работы проги. Весь смысл - периодический опрос. А в твоей модификации - только  FormCreate?

Добавлено @ 22:19
razumsap, а в самом деле, чего мы мучаемся - посмотри в настройках своего броузера - есть явное указание прокси или нет?

Добавлено @ 22:25
Цитата(razumsap @  10.1.2008,  16:33 Найти цитируемый пост)
вобщем, админ наш сказал, что пинг не проходит, по причине того, что мы(наша ОАО) работаем  через 2 прокси 

А админ не сказал причину регулярного отсутствия интернета? Может дело в выключении каких то рутеров или проксей? И пинговать достаточно их, или те же ваши прокси?

Я конечно извиняюсь, но подскажите переменная cbPROXY_SERV - это компонента, если да то какая или что за тип?smile
И ещё если я  знаю настройки прокси сервера, то куда мне их подставлять?

Автор: razumsap 15.1.2008, 09:13
To remax
Повторюсь

одскажите переменная cbPROXY_SERV - это компонента, если да то какая или что за тип?
И ещё если я  знаю настройки прокси сервера, то куда мне их подставлять?

Автор: remax 15.1.2008, 21:06
Цитата(razumsap @  15.1.2008,  09:13 Найти цитируемый пост)
cbPROXY_SERV

компонента, комбобокс. Только этот фрагмент проги тебе не нужен, так как параметры прокси ты и так знаешь. Проблема в том, что обычно я использую инди-компоненты для работы с инетом. Поэтому, как правильно адаптировать примерчик - 
Цитата(remax @  10.1.2008,  00:48 Найти цитируемый пост)
программа проверяет существование определенного адреса в сети
 к работе с прокси я с ходу не скажу. Надо глубже разбираться с WinInet, а сейчас нет времени. Если никто не подбросит Вам вариант, позже набрасаю примерчик с использованием инди....

Но, возможно, все гораздо проще. Когда не работает интернет, проверьте, используя стандартную команду PING,  доступность прокси-сервера. Если дело в этом, то возможно и писать прогу будем по другому.

Автор: MetalFan 15.1.2008, 22:27
посмотри http://forum.vingrad.ru/forum/topic-186678/kw-wininet-tmfwihttp-http-client.html над WinInet. а в WinInet есть возможность использования настроенного в системе прокси

Автор: remax 16.1.2008, 03:06
MetalFan, MFWIHTTP c D7 не дружит? Только с  BDS?

Автор: MetalFan 16.1.2008, 09:08
remax, дружит. чуть его допилить, там кто-то отписывался по этому поводу...

Автор: razumsap 23.1.2008, 11:52
подскажите кто сталкивался,
как при подключениии к интернету обойти запрос ввода Логина и Пароля, т.е. ввести их програмно, чтоб не выскакивало окно, причём с уже заполненными (правильно) данными?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)