PDA

Ver la Versión Completa : es posible conectarse a router por delphi?


XxEdwinxX
06-08-2006, 04:32:32
hola tengo una duda, es posible conectarse a un router en red locar pero utilizando un software echo en delphi?? al ruter puedo conectarme por DOS y en internet explorer pero quisiera saver si puedo hacer una aplicacion que haga lo mismo, al ingresar al router me pide passwor y me se el pasword, quiero automatizar un poco la conexion al router para que realize algunas modificaciones en el router conectandose con su respectivo password, espero me respondan bye

[Gunman]
06-08-2006, 11:27:26
Si se puede hacer mediante el uso de Sockets, no sé muy bien como, pero lo primero que necesitaras será un componente para trabajar con los sockets como el IdTCP o alguno semejante.
Suerte.

XxEdwinxX
06-08-2006, 16:16:27
gracias por responder, estare viendo el tema y uso de sochets para no llenar de preguntas, creo que ese componente es usado para conexion de aplicacion de computadoras en red pero no me imagina que tb se pueda con routers, estare investigando un poco luego posteare algunas dudas mas, de nuevo gracias, bye

seoane
07-08-2006, 00:22:02
Supongo que cuando dices que te puedes conectar por "DOS" te refieres a que lo haces por telnet, si no es así ignora todo lo que pongo a continuación. El protocolo que usa el telnet es bastante sencillo y puede ser todavía mas sencillo si ignoramos algunos detalles. Aquí te dejo una pequeña aplicación que permite reiniciar el router con el comando reboot, pero modificando el script podrías ejecutar la secuencia de comandos que quisieras. El script esta preparado para un Router ADSL COMTREND de los que pone telefónica, para otras marcas y modelos hay que ajustar el script.


program TelScript;

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:= u_long(HostEnt.h_addr_list^);
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.


Edito:

El programa adjunto tiene un fallo en la función Conectar si se le pasa un nombre en vez de la ip, la función corregida seria la siguiente:

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;

XxEdwinxX
07-08-2006, 16:44:38
te agradesco por el codigo, creo que es lo que estoy buscando, boy a provar con el router que tengo, es una thompson speedtouch 530, para dar mas detalles lo que estoy tratando de hacer es poder modificar las reglas de firewall con el software, por telnet es posible pero haver provare con el codigo que me das para provar el rebot y depende de eso tratar de modificar las reglas haciendo login, gracias :)