Discussion:
telnet
(demasiado antiguo para responder)
newsf
2004-11-14 14:47:22 UTC
Permalink
Hola grupo,
quiero hacer un ejecutable que se conecte a vía telnet a un router y que
ejecute una serie de ordenes dentro de el. He visto el tema de los sockets y
me he generado un programa que lo haga (el que aparece abajo). Pero no
consiguo hacer nada.

Luego he leido algunas cosas por ahí y ahora dudo si ademas de hacer la
conexión socket luego tengo que seguir algunos pasos predeterminados, hacer
el envio de datos con algún tipo de formato, etc.... Me puede algúien
iluminar.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 23 /* El puerto donde se conectara
*/
#define MAXDATASIZE 100 /* maxima cant. De bytes que se pueden recibir
en una llamada a recv */
int main(int argc, char *argv[])
{
int sockfd, numbytes; /* Contendra el numero de bytes
recibidos despues de llamar a recv() */
int newfd; /* las transferencias de datos se realizar
mediante newfd */
char buf[MAXDATASIZE]; /* Buffer donde se reciben los datos */
struct hostent *he; /* Se utiliza para
convertir el nombre del host a su direccion IP */
struct sockaddr_in their_addr; /* direccion del server donde se
conectara */
/* Tratamiento de la linea de comandos. */
if (argc != 2)
{
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
/* Convertimos el nombre del host a su direccion IP */
if ((he=gethostbyname(argv[1])) == NULL)
{
herror("gethostbyname");
exit(1);
}
/* Creamos el socket */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
/* Establecemos their_addr con la direccion del server */
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8);
/* Intentamos conectarnos con el servidor */
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr))
== -1)
{
perror("connect");
exit(1);
}

/* Recibimos los datos del servidor */
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
perror("recv");
exit(1);
}


/*prueba de envio de datos*/
if (send(sockfd, "abcd\n", 18, 0) == -1)
perror("send");
/* Visualizamos lo recibido */
buf[numbytes] = '\0';
printf("%s\n",buf);

/* Recibimos los datos del servidor */
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
/* Visualizamos lo recibido */
buf[numbytes] = '\0';
printf("%s\n",buf);

/*prueba de envio de datos*/
if (send(sockfd, "exit\n", 6, 0) == -1)
perror("send");
/* Visualizamos lo recibido */
buf[numbytes] = '\0';
printf("%s\n",buf);


/* Devolvemos recursos al sistema */
close(sockfd);
return 0;
}

Gracias grupo,

Fernando
Manuel Petit
2004-11-16 03:01:42 UTC
Permalink
El código parece correcto a simple vista y compilandolo funciona sin
problemas. El único error que he visto es que despues de mandar el
comand "exit" te olvidas de leer.

La razón por la que no le ves hacer nada es que tienes un recv() como
primera cosa y el servidor de telnet permanece mudo hasta que tu no
digas nada... asi que tu programa se queda esperando. Cambia el puerto a
25 (SMTP) y veras como se comporta de otra manera.


manuel,
Post by newsf
Hola grupo,
quiero hacer un ejecutable que se conecte a vía telnet a un router y que
ejecute una serie de ordenes dentro de el. He visto el tema de los sockets y
me he generado un programa que lo haga (el que aparece abajo). Pero no
consiguo hacer nada.
Luego he leido algunas cosas por ahí y ahora dudo si ademas de hacer la
conexión socket luego tengo que seguir algunos pasos predeterminados, hacer
el envio de datos con algún tipo de formato, etc.... Me puede algúien
iluminar.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 23 /* El puerto donde se conectara
*/
#define MAXDATASIZE 100 /* maxima cant. De bytes que se pueden recibir
en una llamada a recv */
int main(int argc, char *argv[])
{
int sockfd, numbytes; /* Contendra el numero de bytes
recibidos despues de llamar a recv() */
int newfd; /* las transferencias de datos se realizar
mediante newfd */
char buf[MAXDATASIZE]; /* Buffer donde se reciben los datos */
struct hostent *he; /* Se utiliza para
convertir el nombre del host a su direccion IP */
struct sockaddr_in their_addr; /* direccion del server donde se
conectara */
/* Tratamiento de la linea de comandos. */
if (argc != 2)
{
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
/* Convertimos el nombre del host a su direccion IP */
if ((he=gethostbyname(argv[1])) == NULL)
{
herror("gethostbyname");
exit(1);
}
/* Creamos el socket */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
/* Establecemos their_addr con la direccion del server */
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8);
/* Intentamos conectarnos con el servidor */
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr))
== -1)
{
perror("connect");
exit(1);
}
/* Recibimos los datos del servidor */
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
/*prueba de envio de datos*/
if (send(sockfd, "abcd\n", 18, 0) == -1)
perror("send");
/* Visualizamos lo recibido */
buf[numbytes] = '\0';
printf("%s\n",buf);
/* Recibimos los datos del servidor */
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
/* Visualizamos lo recibido */
buf[numbytes] = '\0';
printf("%s\n",buf);
/*prueba de envio de datos*/
if (send(sockfd, "exit\n", 6, 0) == -1)
perror("send");
/* Visualizamos lo recibido */
buf[numbytes] = '\0';
printf("%s\n",buf);
/* Devolvemos recursos al sistema */
close(sockfd);
return 0;
}
Gracias grupo,
Fernando
Loading...