Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Redes (https://www.clubdelphi.com/foros/forumdisplay.php?f=37)
-   -   es posible conectarse a router por delphi? (https://www.clubdelphi.com/foros/showthread.php?t=34340)

XxEdwinxX 06-08-2006 03:32:32

es posible conectarse a router por delphi?
 
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 10: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 15: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 06-08-2006 23:22:02

1 Archivos Adjunto(s)
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.

Código Delphi [-]
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:
Código Delphi [-]
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 15: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 :)


La franja horaria es GMT +2. Ahora son las 20:33:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi