Ir al contenido


Foto

Saber si hay internet


  • Por favor identifícate para responder
12 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 25 noviembre 2011 - 06:57

Buenas con todos, aquí yo de nuevo para hacerles una consultita:

Existirá alguna manera de saber si estoy conectado a internet sin usar
ningún componente externo a lazarus (indy u otros)..... por ejemplo cuando deseo saber
si hay internet lo normal que hacía era poner en la consola de win2 :

ping www.google.com

Y si me salían unos numeritos entonces sabía que había línea, pero
como lo podría hacer en lazarus pascal ....??

PD: lo que deseo de momento es saber si hay internet en la pc osea si hay
    línea.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 28 noviembre 2011 - 08:39

Pues por el momento no existe modo de hacerlo sin componentes de terceros, solo con las indy  ;)
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 noviembre 2011 - 09:45

Si tu S.O. es Windows, pásate por este hilo y este otro.

Saludos.


  • 0

#4 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 28 noviembre 2011 - 12:37

Gracias les daré un vistazo.....  :)
  • 0

#5 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 28 noviembre 2011 - 01:09

Si usas Lazarus y deseas hacerlo en Windows y Linux, checate esto:

http://www.lazarus.f...p?topic=10450.0

En linux verifica tus privilegios antes.

Saludos
  • 0

#6 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 28 noviembre 2011 - 06:52

Muchas gracias "fredycc" por tu respuesta, mas lo que necesito en realidad es realizar la acción que pido pero sin ningún componente externo en tu ejemplo se usa Indy..... de todas maneras agradecido.

voy a probar unos ejemplos y les comento........  :)
  • 0

#7 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 29 noviembre 2011 - 12:28

Hola amiguitos les cuento mis avances,  de momento estoy probando con el ejemplo de
escafandra para verificar la conexión a internet mediante una Unidad "Uping.pas" + Función
al probar estos ejemplos de los enlaces esto fue lo que paso:

- Agregué la Unidad Uping.pas a mi programita
- También le copie la función
- al darle en ejecutar me salió unos errores que logré arreglarlos añadiendo
  punto y coma al final de:


delphi
  1. function IcmpCreateFile: Integer; stdcall external 'iphlpapi'


y


delphi
  1. function IcmpCloseHandle(IcmpHandle: Cardinal): boolean; stdcall external 'iphlpapi'



- Ahora cuando vuelvo a intentar me salé otro error en:


delphi
  1. Result:= IcmpSendEcho(hIcmpFile, PULONG(He.h_addr_list^)^, 0, 0, 0, PCHAR(@Reply), sizeof(ICMP_ECHO_REPLY), 1000) <> 0;


le agregué un "^" a la parte "PULONG(He^.h_addr_list^)^"  , ahora avanza un poquito y se vuelve a parar en:


delphi
  1. 0, 0, 0, PCHAR(@Reply)


los siguientes errores:



delphi
  1. \UPing.pas(47,36) Hint: Local variable "WSA" does not seem to be initialized
  2. \UPing.pas(57,72) Error: Incompatible type for arg no. 5: Got "ShortInt", expected "PChar"
  3. \UPing.pas(9,10) Hint: Found declaration: IcmpSendEcho(LongInt,LongInt,PChar,Word,PChar,PChar,LongWord,LongWord):DWord; StdCall;
  4. \UPing.pas(69) Fatal: There were 1 errors compiling module, stopping



En esta parte ya no se que hacer......... les dejo el código pidiendo apoyo:



delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Uping;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     Button1: TButton;
  16.     Label1: TLabel;
  17.     procedure Button1Click(Sender: TObject);
  18.   private
  19.     { private declarations }
  20.   public
  21.     { public declarations }
  22.   end;
  23.  
  24. var
  25.   Form1: TForm1;
  26.  
  27. implementation
  28.  
  29. {$R *.lfm}
  30.  
  31. { TForm1 }
  32. function Ping(Addr: PCHAR; Rep: integer = 3): boolean;
  33. var
  34.   WSA: TWSAData;
  35.   hIcmpFile: Cardinal;
  36.   Reply: ICMP_ECHO_REPLY;
  37.   He: Phostent;
  38.   n: Integer;
  39. begin
  40.   Result:= false;
  41.  
  42.   // Inicializar WinSock
  43.   if WSAStartup(MAKEWORD(1, 1), WSA) <> 0 then exit;
  44.  
  45.   //Obtener IP de Addr
  46.   He:= gethostbyname(Addr);
  47.   if He = nil then exit;
  48.  
  49.   // Envia Ping
  50.   hIcmpFile:= IcmpCreateFile;
  51.   n:= 0;
  52.   repeat
  53.     Result:= IcmpSendEcho(hIcmpFile, PULONG(He.h_addr_list^)^, 0, 0, 0, PCHAR(@Reply), sizeof(ICMP_ECHO_REPLY), 1000) <> 0;
  54.     if Result then
  55.       Result:= Reply.Status = 0; // Error en Ping el Host no lo recibe....
  56.     inc(n);
  57.   until Result or (n=3);
  58.  
  59.   // Cerrar...
  60.   IcmpCloseHandle(hIcmpFile);
  61.   WSACleanup;
  62. end;
  63.  
  64.  
  65. procedure TForm1.Button1Click(Sender: TObject);
  66. begin
  67.   if Ping('[url=http://www.google.es]www.google.es[/url]') then
  68.     Label1.Caption := 'Exito'
  69.   else
  70.     Label1.Caption := 'Fracaso';
  71. end;
  72.  
  73. end.




y también vuelvo a subir el ping de escafandra si es que se puede con su permiso.
  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 29 noviembre 2011 - 05:34

Delphi y Lazarus difieren en algunas cosillas. Lazarus diferencia cuando usamos un puntero a una estructura, delphi nos deja usar una sintaxis como si de una variable, y no un puntero, se tratara. Así mismo, Lazarus es un poco mas estrictos con los tipos, un 0 no lo asimila a un nul.

Unos pequeños cambios hacen que la unidad UPing.pas compile y funcione:


delphi
  1. // UPing for Lazarus
  2. // escafandra 2011
  3.  
  4. unit UPing;
  5.  
  6. interface
  7.  
  8. uses
  9.   Windows, WinSock;
  10.  
  11. function IcmpCreateFile: Integer; stdcall external 'iphlpapi';
  12. function IcmpSendEcho(Handle, Address: Integer; RequestData: PChar; RequestSize: Word; RequestOptions, ReplyBuffer: PChar; ReplySize, TimeOut: Cardinal): Cardinal; stdcall external 'iphlpapi';
  13. function IcmpCloseHandle(IcmpHandle: Cardinal): boolean; stdcall external 'iphlpapi';
  14. function Ping(Addr: PCHAR; Rep: integer = 3): boolean;
  15.  
  16. type
  17. ICMP_OPTION_INFORMATION =  packed record
  18.   Ttl:          u_char;
  19.   Tos:          u_char;
  20.   Flags:        u_char;
  21.   OptionsSize:  u_char;
  22.   OptionsData:  Pointer;
  23. end;
  24. PICMP_OPTION_INFORMATION=  ^ICMP_OPTION_INFORMATION;
  25.  
  26. ICMP_ECHO_REPLY = packed record
  27.   Address:      Cardinal;
  28.   Status:        Cardinal;
  29.   RoundTripTime: Cardinal;
  30.   DataSize:      Word;
  31.   Reserved:      Word;
  32.   Data:          Pointer;
  33.   Options:      ICMP_OPTION_INFORMATION;
  34. end;
  35. PICMPP_ECHO_REPLY = ^ICMP_ECHO_REPLY;
  36.  
  37. implementation
  38.  
  39. function Ping(Addr: PCHAR; Rep: integer = 3): boolean;
  40. var
  41.   WSA: TWSAData;
  42.   hIcmpFile: Cardinal;
  43.   Reply: ICMP_ECHO_REPLY;
  44.   He: Phostent;
  45. begin
  46.   Result:= false;
  47.  
  48.   // Inicializar WinSock
  49.   if WSAStartup(MAKEWORD(1, 1), WSA) <> 0 then exit;
  50.  
  51.   //Obtener IP de Addr
  52.   He:= gethostbyname(Addr);
  53.   if He = nil then exit;
  54.  
  55.   // Envia Ping
  56.   hIcmpFile:= IcmpCreateFile;
  57.   repeat
  58.     Result:= IcmpSendEcho(hIcmpFile, PULONG(He^.h_addr_list^)^, nil, 0, nil, PCHAR(@Reply), sizeof(ICMP_ECHO_REPLY), 1000) <> 0;
  59.     if Result then
  60.       Result:= Reply.Status = 0; // Error en Ping el Host no lo recibe....
  61.     dec(Rep);
  62.   until Result or (Rep = 0);
  63.  
  64.   // Cerrar...
  65.   IcmpCloseHandle(hIcmpFile);
  66.   WSACleanup;
  67. end;
  68.  
  69. end.


Subo la unidad retocada para Lazarus y una pequeña aplicación de ejemplo.


Saludos.
  • 0

#9 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 29 noviembre 2011 - 06:19

Gracias Escafandra por tu ayuda e interes, lo probaré y luego les cuento.... :) :)
  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 30 noviembre 2011 - 12:59

Releyendo el código que puse, me he percatado de un detalle. No estaba haciendo uso del parámetro Rep. Ese parámetro lo añadí a última hora para controlar el número de veces que queremos que se realice un ping antes de considerarlo fracasado. He editado dicho código y el ejemplo subido.

Saludos.
  • 0

#11 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 02 diciembre 2011 - 06:51

Buenas amiguitos, resulta que lo he probado y siempre me sale "Fracaso" o sea como si no hubiera internet, que puede ser.....???

Les muestro el código:


delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Uping;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     Button1: TButton;
  16.     Edit1: TEdit;
  17.     Label1: TLabel;
  18.     procedure Button1Click(Sender: TObject);
  19.   private
  20.     { private declarations }
  21.   public
  22.     { public declarations }
  23.   end;
  24.  
  25. var
  26.   Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. {$R *.lfm}
  31.  
  32. { TForm1 }
  33.  
  34. procedure TForm1.Button1Click(Sender: TObject);
  35. begin
  36.   {if Ping('[url=http://www.google.es]www.google.es[/url]') then
  37.     Label1.Caption := 'Exito'
  38.   else
  39.     Label1.Caption := 'Fracaso';}
  40.  
  41.   //application.ProcessMessages;    lo puse pensando que iba a trabajar mejor
  42.  
  43.   Label1.Caption := 'Haciendo ping...';
  44.   Label1.Update;
  45.  
  46.   if Ping(PCHAR(Edit1.Text)) then
  47.     Label1.Caption := 'Exito'
  48.   else
  49.     Label1.Caption := 'Fracaso';
  50. end;
  51.  
  52. end. 



Que puede ser....???

Gracias por sus comentarios.
 
  • 0

#12 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2011 - 07:48


Buenas amiguitos, resulta que lo he probado y siempre me sale "Fracaso" o sea como si no hubiera internet, que puede ser.....???


¿Tu conexión está detrás de un proxy?, en ese caso: ¿Leíste el enlace que te dí?

Si estás detrás de un proxy, puede ser que tengas que autentificarte, si no lo haces se rechazan los intentos de conexión a internet.


Saludos.
  • 0

#13 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 08 diciembre 2011 - 07:54

Buenas amiguitos y disculpen por la demora  :sad: lo que pasa es que el viernes pasado asaltaron mi casa y se llevaron varias cosas incluyendo mi pc,  : : :, bueno en cuanto al programita parece parece que me funciona cuando pongo:


delphi
  1. if Ping('[url=http://www.google.es]www.google.es[/url]') then
  2.     Label1.Caption := 'Exito'
  3.   else
  4.     Label1.Caption := 'Fracaso';[/delphi]
  5.  
  6. en vez de :
  7.  
  8. [delphi]Label1.Caption := 'Haciendo ping...';
  9.   Label1.Update;
  10.  
  11.   if Ping(PCHAR(Edit1.Text)) then
  12.     Label1.Caption := 'Exito'
  13.   else
  14.     Label1.Caption := 'Fracaso';



Bueno amiguitos seguiré probando y ahí les cuento, saludos......

PD:  :
  • 0




IP.Board spam blocked by CleanTalk.