El Sábado, 15 de Enero de 2005 14:17, chakal escribió:
Toy haciendo un cliente telnet para automatizar mi router ... ¿Que
protocolo se usa para hacer un cliente telnet AF_INET o AF_LOCAL?, alguna
pagina donde venga un ejemplo?
salu2
Lo que pides, no es muy complicado. Pero has de tener en cuenta
que el protocolo Telnet, ARPA-TELNET, va sobre TCP/IP, y en un programa
en C, has de usar AF_INET.
Aqui te hago un pequeño programa que te permitirá conectarte a un host.
No obstante, no usa nada del protocolo ARPA-TELNET, que en algun caso
es necesario, del mismo modo que en algun caso se transmite con un protocolo
de terminal vt-ansi...
:::::::::::::::Programa de conexion a un host ::::::::::::::::::::::::::
#include
#include
#include
#include
#include
#include
#include
#include
int Conecta(char *dir,int port)
{
int s,c;
struct hostent *h;
struct sockaddr_in sin;
sin.sin_family=PF_INET;
sin.sin_port=htons((short)port);
if((sin.sin_addr.s_addr=inet_addr(dir))==INADDR_NONE)
{
h=gethostbyname(dir);
if (h==NULL)
return -1;
else
sin.sin_addr.s_addr=inet_addr(inet_ntoa(*((struct in_addr
*)h->h_addr)));
}
memset(sin.sin_zero,0,sizeof(sin.sin_zero));
s=socket(PF_INET,SOCK_STREAM,0);
if (s>=0)
{
c=connect(s,(struct sockaddr *)&sin, sizeof(struct sockaddr));
if (c) {close(s);return -1;}
return s;
}
return -1;
}
int main(int argc,char **argv)
{
int port;
int sck;//socket ...
int ln;
char buf[4096];
FD_SET rd,RD;//Set's para controlar la entrada del teclado y los paquetes
recibidos por el socket.
if (argc < 2) {printf("Uso: %s host puerto\n",argv[0]);return 0;}
port=atoi(argv[2]);
sck=Conecta(argv[1],port);
if (sck<0) {printf("No se ha podido conectar\n");return 0;}
//Conexion abierta, vamos a esperar con un select de la entrada estandard
//o del socket.
FD_ZERO(&RD);
FD_SET(0,&RD);//Añadimos el fd 0 (standard input)
FD_SET(sck,&RD);//Tambien añadimos al conjunto, el fd del socket.
while(1)
{
rd=RD;//la funcion select modifica el set, así lo actualizamos siempre.
select(sck+1,&rd,0,0,0);//El ultimo parámetro es 0, así se espera hasta
recibir un paquete.
if (FD_ISSET(sck,&rd))
{
//Hay algun dato en el socket, para leer.
//Cuando un socket o una pipe, se cierran, los eventos de Read quedan
activados infinitamente, pero! se reciben siempre 0 bytes, con lo que se
puede interpretar que se ha cerrado la conexion.
//otra manera es usar el 4 parámetro del select, que son las excepciones
//que envia el File Descriptor, pero la más comoda para mi es esta.
ln=read(sck,buf,4096);
if (ln<=0) {printf("Conexión cerrada\n");return 0;}
//Hemos recibido algo, lo escribimos por pantalla.
write(1,buf,ln);
}
if (FD_ISSET(0,&rd))
{
//Hay algun dato procedente de standard input (teclado)
//Si no se cambian las opciones de terminal, no se envia nada
//hasta que no se pulsa un enter.
ln=read(sck,buf,4096);
if (ln<=0) {printf("Control-D pulsado\n");return 0;}
//Hemos recibido algo del teclado, lo enviamos al socket
write(sck,buf,ln);
}
}
}
//Atencion, este programa ha sido escrito directamente por el correo
//Asi que puede contener fallos
//Esto te bastará para empezar, se supone que poniendo:
// ./programa router 23
//Se conectaria al router, i permitiria enviarle alguna cosa...
//Faltaria implementar el protocolo ARPA-TELNET, y controlar la consola
//para eliminar el echo y cambiar el modo C_BREAK para admitir que envie
//Cada caracter (tambien se puede poner a modo RAW el teclado)
//Pero eso seria para hacer un telnet, y no para controlar el router
//Para controlar el router esto ultimo no te seria necesario.
::::::::::::::::::::::Fin del programa::::::::::::::::::::::
--
################################################
#- Urbez Santana i Roma -
#- Email: urbez@linuxupc.upc.es
#- Private Web: http://linuxupc.upc.es/~urbez/
################################################