Páginas: [1] 2
|
 |
|
Autor
|
Tema: Duda IP cliente servidor. (Leído 626 veces)
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
En programación de sockets, cuando se quiere interconectar dos PC, en uno un programa servidor y en otro uno cliente. ¿Se puede definir la IP como 127.0.0.1, o se deberá obtener la del equipo mediante la función gethostbyname()?
Tengo esa duda, pues para los programas que corren bajo mismo equipo se puede utilizar dicha IP pero cuando se quieren interconectar diferentes equipos no se si es válida...
Saludos y gracias.
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Perdón por el doble post. Si no se puede hacer como he comentado en el anterior post, podrían explicarme la función gethostbyname? Es un lío y por más que leo no se me aclara mucho la duda,
Saludos
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
dooque
Desconectado
Mensajes: 68
|
para trbajar con programas en red con una, dos o mas maquinas es nesesario saber la ip de la pc sobre la cual esta corriendo el proceso al q uno se va a conectar!
la funcion gethostbyname() lo que hace es tomar un nombre de dominio como por ejemplo "google.com.ar" y devolverte la ip asociada al nombre de dominio, en este caso 64.233.187.104 por lo que si quieres averiguar la ip de un pc cualquiera no puedes a menos q su ip tenga asociado un nombre de dominio! si no entendes de lo q te hablo busca algo en 64.233.187.104 jeje! y si no postea y respondemos por aqui
saludos
|
|
|
|
« Última modificación: 01 Julio 2008, 04:00 por dooque »
|
En línea
|
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Ya entiendo compañero, he sacado un ejemplo de la función gethostbyname() de mi amigo Google: struct hostent *Host;
Host = gethostbyname ("Nombre_Servidor"); if (Host == NULL) { printf ("Error\n"); } ¿En nombre de servidor que parámetro se le pasa a la función? Cita de la web: El parámetro que hay que pasar es una cadena de caracteres con el nombre del servidor, tal cual lo pusimos en el fichero /etc/hosts ¿Obligatoriamente hay que insertar en /etc/hosts el nombre de servicio para pasarselo por parámetro? Saludos, gracias.
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
dooque
Desconectado
Mensajes: 68
|
Citar El parámetro que hay que pasar es una cadena de caracteres con el nombre del servidor, tal cual lo pusimos en el fichero /etc/hosts
¿Obligatoriamente hay que insertar en /etc/hosts el nombre de servicio para pasarselo por parámetro? emm! el nombre del servidor es justamente eso, el nombre de dominio, por ejemplo "google.com.ar" struct hostent *host host = gethostbyname("google.com.ar") entonces host->h_addr == "64.233.187.104" por aca tengo un codigo q capas te sea de ayuda! ahi va.... int main(int argc, char **argv){ struct sockaddr_in server_addr; struct hostent *hostent = NULL; int sockfd = 0; assert(argc == 3); /* Inicializacion de la estructura server_addr */ memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; /* Obtengo el IP de servidor */ if(is_ip_addr(argv[1])){ server_addr.sin_addr.s_addr = inet_addr(argv[1]); } else{ hostent = gethostbyname(argv[1]); if(hostent == NULL){ printf("gethostbyname failed\n"); exit(2); } server_addr.sin_addr = *((struct in_addr *)hostent->h_addr); }
/* Obtengo el puerto */ server_addr.sin_port = htons(atoi(argv[2])); /* Creo un socket */ sockfd = socket(PF_INET, SOCK_STREAM, 0); if(sockfd < 0){ printf("socket failed\n"); exit(3); } /* Me conecto al servidor */ if(connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0){ printf("connect failed\n"); close(sockfd); exit(4); } printf("Conected to %s\nOn port %i\n", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port));
esto es solo un pedaso del programa no hace nada ms q conectarse al sevidor! espero q te sirva! saludos!
|
|
|
|
« Última modificación: 01 Julio 2008, 19:18 por dooque »
|
En línea
|
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Hola, gracias por la ayuda, perdon por la tardanza, no entiendo este fragmento de código: /* Obtengo el IP de servidor */ if(is_ip_addr(argv[1])){ server_addr.sin_addr.s_addr = inet_addr(argv[1]); } else{ hostent = gethostbyname(argv[1]); if(hostent == NULL){ printf("gethostbyname failed\n"); exit(2); } server_addr.sin_addr = *((struct in_addr *)hostent->h_addr); } Lo que está en negrita, gracias un saludete. 
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
dooque
Desconectado
Mensajes: 68
|
jaja es q claro! es un pedaso del programa! la funcion is_ip_addr() esta echa por mi y te dice si el string que toma es una direccion ip en la forma decimal con punto. en ese caso como ya tengo la ip se la meto a la estrctura! en caso de q no sea un direccion ip de esa forma es porque es un nombre de dominio, entonces busco su respectiva ip con la funcion gethostbynme() y la meto a la estructura casteandola de esa fomra! argv[1] es el argumento en posicion 1 de la funcion main! aver aca te pongo un ejemplo mas claro q compila y funciona jaja! lo q hace es lo mismo q el comando host de Linux, tu le pass un nombre de dominio y te dice la ip asociada! int main(int argc, char **argv){ struct hostent *host = NULL; if(argc != 2){ printf("Uso: host host_name\n"); return 0; } /* Obtengo el IP de servidor */ host = gethostbyname(argv[1]); if(host == NULL){ printf("gethostbyname failed\n"); exit(2); } printf("La direccion IP de %s es %s\n", argv[1], inet_ntoa(*((struct in_addr *)host->h_addr))); return 0; } no tiene las cabeseras porque no estoy en mi pc y estoy en windows y no me acuerdo la cabesera para gethostbyname en linux! espero q esto te aclare algo mas! saludos!
|
|
|
|
|
En línea
|
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Me aclara bastante muchas gracias, nos vemos en el msn. Saludos 
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Perdon por el doble post, pero esta función me lleva frito  No se utilizar ni gethostbyname() ni tampoco getservbyname()... Me limité a no utilizar ninguna de esas funciones y definí el puerto en una variable, y el resultado fue un error de compilación, aqui dejo una imágen con el fragmento de código y el error en consola al compilar en Linux... Imagen:  ---> http://img45.imageshack.us/img45/2973/pantallazokx5.pngHaber si pueden ayudarme con las funciones, o suministrarme algun tipo de documento, ya que no encuentro sobre ellas... Y ya de paso ayudadme con el error imprimido por la consola... Saludos perdonen las molestias. 
|
|
|
|
« Última modificación: 03 Julio 2008, 16:03 por sarkis »
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
Leber
Desconectado
Mensajes: 261
"Las estrellas se apagan..."
|
En el accept tienes el casting mal. Seria asi: accept(Des_Server,(struct sockaddr *)&conexion,&tamano) Saludos
|
|
|
|
|
En línea
|
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
En el accept tienes el casting mal. Seria asi: accept(Des_Server,(struct sockaddr *)&conexion,&tamano) Saludos Se me coló programando el código el puntero, que fallo más tonto...Ahora si funciona  Gracias.
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Buenas de nuevo, ahora el problema que tengo es al envair los mensajes...Cuando inserto un mensaje, por ejemplo Hola, se envia al cliente y pone un error que dice "Fallo de segmentación"...  Dejo unas imágenes:  Y los fragmentos de código; Servidor: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
int main() { int Descriptor_Servidor, Descriptor_Cliente; int tamano_sockaddr = sizeof(struct sockaddr); int PUERTO = 6000; char cadena; struct sockaddr_in conexion;
Descriptor_Servidor = socket(AF_INET, SOCK_STREAM, 0); if (Descriptor_Servidor == -1) { printf("Error: No se ha podido abrir el socket servidor."); }
conexion.sin_family = AF_INET; conexion.sin_port = htons(PUERTO); conexion.sin_addr.s_addr = INADDR_ANY;
if (bind (Descriptor_Servidor, (struct sockaddr *) &conexion, sizeof(conexion)) == -1) { printf("Error: No se ha podido avisar al Sistema Operativo."); }
if (listen(Descriptor_Servidor, 1) == -1) { printf("Error: Notificaciones de conexion entrantes fallidas."); }
Descriptor_Cliente = accept(Descriptor_Servidor, (struct sockaddr *) &conexion, &tamano_sockaddr); if (Descriptor_Cliente == -1) { printf ("Error: No se ha podido atender a las conexiones entrantes."); }
printf ("Introduzca un mensaje: "); scanf ("%s", &cadena); send (Descriptor_Servidor, (const void*)&cadena, sizeof (cadena), 0);
close(Descriptor_Servidor); close(Descriptor_Cliente); } Cliente #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
#define IP "127.0.0.1"
int main() {
int Descriptor_Cliente; int PUERTO = 6000; int Estado_Conexion; char cadena_recibida; struct sockaddr_in conexion;
Descriptor_Cliente = socket(AF_INET, SOCK_STREAM, 0); if (Descriptor_Cliente == -1) { printf("Error: No se ha podido abrir el socket cliente."); }
conexion.sin_family = AF_INET; conexion.sin_port = htons(PUERTO); conexion.sin_addr.s_addr = (inet_addr(IP)); Estado_Conexion = connect(Descriptor_Cliente, (struct sockaddr *) &conexion, sizeof(conexion)); if (Estado_Conexion == -1) { printf("Error: No se ha podido conectar al servidor."); } recv (Descriptor_Cliente, (void*)&cadena_recibida, sizeof (cadena_recibida), 0); printf ("%s", cadena_recibida);
close(Descriptor_Cliente); } No sabía que los sockets eran tan dificiles... Saludos... 
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
Leber
Desconectado
Mensajes: 261
"Las estrellas se apagan..."
|
char cadena; scanf ("%s", &cadena); Esto esta mal, defines cadena como si solo fuera a ocupar 1 byte, es decir, un caracter, luego lo recoges como una cadena. La parte que finalmente peta es en el cliente: char cadena_recibida; printf ("%s", cadena_recibida); Aqui da el fallo de segmentacion. Como ves, no es tema de sockets, es algo mas basico  Saludos
|
|
|
|
|
En línea
|
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
|
|
|
Sarkis
Desconectado
Mensajes: 532
C/C++ Programmer...
|
Ya, me dí cuenta al postearlo, pero luego puse:
char cadena [256];
Y un sizeof (cadena) como parámetro a la funcion send().
Para que estuviera correcto, pero al enviar el mensaje correctamente el cliente lo recibia como simbolos raros de interrogación:
???.N= ----> Así mas menos.
Tuve pereza a cambiar el código pero lo hice de esa manera.
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
|
Lambda
|
cuando haces char cadena[256]; esa variable tiene basura, hazle un memset(&cadena, 0, sizeof(cadena)); y deberian de desaparecer esos caracteres basura 
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1] 2
|
|
|
|