![](https://seccdn.libravatar.org/avatar/1fce8d476379dab83f9b66fb4a952fff.jpg?s=120&d=mm&r=g)
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 <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> 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/ ################################################