PDA

Ver la Versión Completa : programar, para internet con delphi


keikurono
21-05-2007, 18:13:55
hola a todos

bueno, tengo un problema, no se como programar con delphi para que desde el programa creado con él, se pueda conectar a internet (via consola osea >>telnet www.nombre_pagina.com (http://www.nombre_pagina.com/) )para luego dar comandos en el (osea en la consola) lo queria hacer con el cmd pero no me sé los comandos de este, y
me parecio mas facil hacerlo via delphi.

osea lo que quiero hacer es: via telnet conectarme a mi router y luego dar los comandos uno tras otro hasta reiniciarlo, pero lo quiero hacer cada x minutos y esto me hace pensar que lo pueda hacer con el delphi con esa paleta llamada time:) pero de allí ahora que lo pienso como hago para conectarme al cmd:p :p ???

haver que me dicen para hacer la jugada:D ojo que mi router no lo tengo a la mano ...

saludos.

keikurono
21-05-2007, 18:15:55
haa y una cosa mas ... si alguien sabria de algun manual delphi para programar, y como utilizar la paleta internet de delphi se agradeceria..

saludoss..

seoane
21-05-2007, 19:05:40
Te veo un poco perdido ;) , no entiendo por que metes al cmd en esto. El cmd simplemente es un interprete de comandos. Supongo que tu estas hablando del telnet, que no es un "comando" del cmd, sino que es un programa.

Por otro lado, para conectarte por telnet al router no necesitas de ningún programa. El protocolo telnet es de los mas sencillos, básicamente consiste en enviar y recibir lineas de texto, nada mas. Así que con muy poco, puedes hacer que tu programa se comunique con el router.

No indicas que versión de delphi estas usando, ni de que componentes dispones. Si tienes instalados los componentes Indy, en la paleta encontraras un cliente de telnet, si solo dispones de TClientSocket o TTCPClient (el que viene con los turbos), tampoco te sera muy difícil. Y si no dispones de nada, pues lo hacemos a mano :D .

Por ejemplo, esto lo utilizo con mi router ADSL COMTREND, que me puso Telefónica, para reiniciarlo. En tu caso tendrás que adaptarlo a tu marca y modelo de router, ya que los comandos y respuestas pueden ser diferentes.

// Es una aplicación de consola

program TelScript;

{$APPTYPE CONSOLE}

uses Windows, Sysutils, WinSock;

// Crea un socket y lo conecta a la direccion indicada.
function Conectar(Host: string; Puerto: Integer): TSocket;
var
Address: u_long;
HostEnt: phostent;
Addr: sockaddr_in;
begin
Result:= INVALID_SOCKET;
Address:= inet_addr(Pchar(Host));
if Address = INADDR_NONE then
begin
HostEnt:= gethostbyname(PChar(Host));
if HostEnt <> nil then
Address:= PInAddr(HostEnt.h_addr_list^)^.S_addr;
end;
if Address <> INADDR_NONE then
begin
Result:= socket(AF_INET, SOCK_STREAM, 0);
if Result <> INVALID_SOCKET then
begin
Addr.sin_family:= AF_INET;
Addr.sin_addr.S_addr:= Address;
Addr.sin_port:= htons(Puerto);
if connect(Result, Addr, Sizeof(Addr)) = SOCKET_ERROR then
begin
closesocket(Result);
Result:= INVALID_SOCKET;
end;
end;
end;
end;

// Envia un texto al router
function Enviar(Socket: TSocket; Str: string): Boolean;
begin
Result:= send(Socket,PChar(Str)^,Length(Str),0) <> SOCKET_ERROR;
end;

// Esta funcion espera hasta que recibe una respuesta, si transcurrido
// un tiempo prudencial no se recibe la respuesta esperada la
// funcion termina y devuelve FALSE
const
Alfanumericos = ['A'..'Z','a'..'z','0'..'9',':','-','<','>',' ','.'];

function EsperarStr(Socket: TSocket; Str: string; TimeOut: Cardinal): boolean;
var
i,j: integer;
s: string;
Tick: DWORD;
FDSet: TFDSet;
TimeVal: TTimeVal;
Buffer: array[0..1024] of Char;
begin
s:= '';
Tick := GetTickCount;
while not (pos(Str, s) > 0) do
begin
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
FD_ZERO(FDSet);
FD_SET(Socket, FDSet);
if select(0, @FDSet, nil, nil, @TimeVal) > 0 then
begin
fillchar(Buffer, sizeof(Buffer), 0);
i := recv(Socket, Buffer, sizeof(Buffer) - 1, 0);
if (i > 0) then
begin
for j:= 0 to i-1 do
if Buffer[j] in Alfanumericos then
s:= s + Buffer[j];
end else
break;
end
else if (GetTickCount - Tick) > TimeOut then
break;
end;
Result:= pos(Str, s) > 0;
end;

// Este es el script que se ejecuta en el router, dependiendo del router,
// puede que sea necesario cambiar alguna cosa. Este esta diseñado
// para un router ADSL CONTREND de telefonica.
function Script(Socket: TSocket): Boolean;
begin
Result:= FALSE;
// Esperamos a que nos pida el login
if EsperarStr(Socket,'ogin:',5000) then
begin
// Enviamos el login (1234 en mi caso)
Enviar(Socket,'1234'+#13);
// Esperamos a que nos pida el password
if EsperarStr(Socket,'assword:',5000) then
begin
// Enviamos el password (1234 en mi caso)
Enviar(Socket,'1234'+#13);
// Esperamos hasta ver el prompt
if EsperarStr(Socket,'->',5000) then
begin
// Enviamos el comando reboot
Enviar(Socket,'reboot'+#13);
// Esperamos hasta que el router comienza con el reset
if EsperarStr(Socket,'wait...',5000) then
begin
Result:= TRUE;
end;
end;
end;
end;
end;

// Esta funcion la usamos para mostrar mensajes
procedure Mensaje(Str: string);
begin
Messagebox(0,PChar(Str),'TelScript',MB_OK);
end;

procedure Vamos;
var
WSAData: TWSADATA;
Socket: TSocket;
begin
if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
begin
// Conectamos con el router, en mi caso, la direccion es 192.168.1.1
Socket:= Conectar('192.168.1.1',23);
if Socket <> INVALID_SOCKET then
begin
// Ejecutamos el script
if Script(Socket) then
Mensaje('El script termino con exito')
else
Mensaje('El script no pudo completarse');
closesocket(Socket);
end else
Mensaje('No puedo establecer la conexion con el router');
WSACleanup;
end;
end;

begin
Vamos;
end.

keikurono
21-05-2007, 19:52:55
Gracias por responder rapidamente..

...Este programa es solo para entrar al router o es para reiniciarlo ??

ademas yo quiero reiniciar el router cada "x" minutos..

no entiendo algunos componentes me dirias de algun manual de como usar socket y entre otross que no los comprendo como
var
Address: u_long; ?
HostEnt: phostent;?
Addr: sockaddr_in;??......



...y utilizo delphi 7!!!!

saludoss

fide
08-06-2007, 00:06:03
A mi tambien me hace mucha falta aprender a trabajar bien con los sockets.

jeremiselxi
13-12-2008, 19:21:55
Te veo un poco perdido ;) , no entiendo por que metes al cmd en esto. El cmd simplemente es un interprete de comandos. Supongo que tu estas hablando del telnet, que no es un "comando" del cmd, sino que es un programa.

Por otro lado, para conectarte por telnet al router no necesitas de ningún programa. El protocolo telnet es de los mas sencillos, básicamente consiste en enviar y recibir lineas de texto, nada mas. Así que con muy poco, puedes hacer que tu programa se comunique con el router.

No indicas que versión de delphi estas usando, ni de que componentes dispones. Si tienes instalados los componentes Indy, en la paleta encontraras un cliente de telnet, si solo dispones de TClientSocket o TTCPClient (el que viene con los turbos), tampoco te sera muy difícil. Y si no dispones de nada, pues lo hacemos a mano :D .

Por ejemplo, esto lo utilizo con mi router ADSL COMTREND, que me puso Telefónica, para reiniciarlo. En tu caso tendrás que adaptarlo a tu marca y modelo de router, ya que los comandos y respuestas pueden ser diferentes.

// Es una aplicación de consola

program TelScript;

{$APPTYPE CONSOLE}

uses Windows, Sysutils, WinSock;

// Crea un socket y lo conecta a la direccion indicada.
function Conectar(Host: string; Puerto: Integer): TSocket;
var
Address: u_long;
HostEnt: phostent;
Addr: sockaddr_in;
begin
Result:= INVALID_SOCKET;
Address:= inet_addr(Pchar(Host));
if Address = INADDR_NONE then
begin
HostEnt:= gethostbyname(PChar(Host));
if HostEnt <> nil then
Address:= PInAddr(HostEnt.h_addr_list^)^.S_addr;
end;
if Address <> INADDR_NONE then
begin
Result:= socket(AF_INET, SOCK_STREAM, 0);
if Result <> INVALID_SOCKET then
begin
Addr.sin_family:= AF_INET;
Addr.sin_addr.S_addr:= Address;
Addr.sin_port:= htons(Puerto);
if connect(Result, Addr, Sizeof(Addr)) = SOCKET_ERROR then
begin
closesocket(Result);
Result:= INVALID_SOCKET;
end;
end;
end;
end;

// Envia un texto al router
function Enviar(Socket: TSocket; Str: string): Boolean;
begin
Result:= send(Socket,PChar(Str)^,Length(Str),0) <> SOCKET_ERROR;
end;

// Esta funcion espera hasta que recibe una respuesta, si transcurrido
// un tiempo prudencial no se recibe la respuesta esperada la
// funcion termina y devuelve FALSE
const
Alfanumericos = ['A'..'Z','a'..'z','0'..'9',':','-','<','>',' ','.'];

function EsperarStr(Socket: TSocket; Str: string; TimeOut: Cardinal): boolean;
var
i,j: integer;
s: string;
Tick: DWORD;
FDSet: TFDSet;
TimeVal: TTimeVal;
Buffer: array[0..1024] of Char;
begin
s:= '';
Tick := GetTickCount;
while not (pos(Str, s) > 0) do
begin
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
FD_ZERO(FDSet);
FD_SET(Socket, FDSet);
if select(0, @FDSet, nil, nil, @TimeVal) > 0 then
begin
fillchar(Buffer, sizeof(Buffer), 0);
i := recv(Socket, Buffer, sizeof(Buffer) - 1, 0);
if (i > 0) then
begin
for j:= 0 to i-1 do
if Buffer[j] in Alfanumericos then
s:= s + Buffer[j];
end else
break;
end
else if (GetTickCount - Tick) > TimeOut then
break;
end;
Result:= pos(Str, s) > 0;
end;

// Este es el script que se ejecuta en el router, dependiendo del router,
// puede que sea necesario cambiar alguna cosa. Este esta diseñado
// para un router ADSL CONTREND de telefonica.
function Script(Socket: TSocket): Boolean;
begin
Result:= FALSE;
// Esperamos a que nos pida el login
if EsperarStr(Socket,'ogin:',5000) then
begin
// Enviamos el login (1234 en mi caso)
Enviar(Socket,'1234'+#13);
// Esperamos a que nos pida el password
if EsperarStr(Socket,'assword:',5000) then
begin
// Enviamos el password (1234 en mi caso)
Enviar(Socket,'1234'+#13);
// Esperamos hasta ver el prompt
if EsperarStr(Socket,'->',5000) then
begin
// Enviamos el comando reboot
Enviar(Socket,'reboot'+#13);
// Esperamos hasta que el router comienza con el reset
if EsperarStr(Socket,'wait...',5000) then
begin
Result:= TRUE;
end;
end;
end;
end;
end;

// Esta funcion la usamos para mostrar mensajes
procedure Mensaje(Str: string);
begin
Messagebox(0,PChar(Str),'TelScript',MB_OK);
end;

procedure Vamos;
var
WSAData: TWSADATA;
Socket: TSocket;
begin
if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
begin
// Conectamos con el router, en mi caso, la direccion es 192.168.1.1
Socket:= Conectar('192.168.1.1',23);
if Socket <> INVALID_SOCKET then
begin
// Ejecutamos el script
if Script(Socket) then
Mensaje('El script termino con exito')
else
Mensaje('El script no pudo completarse');
closesocket(Socket);
end else
Mensaje('No puedo establecer la conexion con el router');
WSACleanup;
end;
end;

begin
Vamos;
end.


lo he intentado de todas formas y por mas que trato lo unico que me sale es este mensaje Mensaje('El script no pudo completarse');
en esta pagina esta mas o menos lo que quiero hacer..
http://jhonatan.net78.net/nuevo/invento.html
yo uso delphi 6 y ademas el modem es el Thomson Tg 585 v7....
si es posible hacerlo mas facil o como tu quieras... de antemano gracias por contestarme y ayudarme....

seoane
13-12-2008, 21:58:27
Pon el código que estas usando, porque es un poco difícil ayudarte sin saber lo que estas haciendo :)

jeremiselxi
14-12-2008, 16:24:37
yo encontre una pagina que te enseña a usar el componente idtelnet via grafica y funciona bien... pero gracias a todos por responder en mi tema y a mi pregunta....... la pagina es la siguiente...
http://delphiallimite.blogspot.com/2008/10/creando-un-cliente-de-telnet.html
esta pagina es jevi para novatos como yo:). espero que les ayude tanto como a mi....

jeremiselxi
15-12-2008, 13:27:37
si no les funciona estos son los codigos
procedure TForm1.FormCreate(Sender: TObject);
begin
log.Text :='';
end;

procedure TForm1.telnetConnect;
begin
Log.Lines.Add( 'Conectando con ' + Telnet.Host + '.' );
Log.Lines.Add( '' );
end;

procedure TForm1.telnetDataAvailable(Buffer: String);
begin
Log.Text := Log.Text + Buffer;
Log.SelStart := Length( Log.Text );
end;

procedure TForm1.LogKeyPress(Sender: TObject; var Key: Char);
begin
if not Telnet.Connected then
Exit;

if Key = #13 then
begin
log.Text :='';
Telnet.WriteLn(sComando );
sComando := '';

end
else
sComando := sComando + Key;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
telnet.Disconnect;

exit;
close;


end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Telnet.Host := IPServidor.Text;
Telnet.Port := StrToInt( Puerto.Text );
Telnet.Connect;
log.Text :='';
Log.SetFocus;
end;

end.

jeremiselxi
31-12-2008, 18:11:08
Pon el código que estas usando, porque es un poco difícil ayudarte sin saber lo que estas haciendo :)

quiero darte las gracias por ser una persona preocupada por ayudar a los demas en todo lo que puedas.:) espero alqun dia ser como tu... ah otra cosa...el ejemplo que puse mas arriba de el programa telnet con delphi tiene un solo problema.... ejemplo, si tu tienes en un notepad el usuario y la contraseña entrando por telnet tu puedes copiar el username y pergarlo todo en el telnet cliente y asimismo con el password, pero si tu lo haces asi con el programa ese que consegui no funciona eso. te explico donde yo trabajo que en claro dandole soporte a puerto rico hay una pagina donde estan unos codigos para programar el wireless por medio del telnet pero consola y utilizan mucho el copiar y pegarlo en el ternel, pero que pasa? que cuando hago esto con el programa no funciona.... necesito a ver si tu me puedes ayudar..... muchas gracias de antemano y palante mi hermano...:)