elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
11 Octubre 2008, 19:01  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++
| | |-+  Duda IP cliente servidor.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Imprimir
Autor Tema: Duda IP cliente servidor.  (Leído 626 veces)
Sarkis

Desconectado Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Duda IP cliente servidor.
« en: 30 Junio 2008, 20:44 »

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 Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #1 en: 30 Junio 2008, 23:51 »

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 Desconectado

Mensajes: 68


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #2 en: 01 Julio 2008, 03:57 »

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 Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #3 en: 01 Julio 2008, 14:12 »

Ya entiendo compañero, he sacado un ejemplo de la función gethostbyname() de mi amigo Google:

Código:
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:

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?

Saludos, gracias.

En línea



.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
dooque

Desconectado Desconectado

Mensajes: 68


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #4 en: 01 Julio 2008, 19:09 »

Citar
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....

Código:
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 Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #5 en: 02 Julio 2008, 14:41 »

Hola, gracias por la ayuda, perdon por la tardanza, no entiendo este fragmento de código:

Citar
/* 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 Desconectado

Mensajes: 68


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #6 en: 02 Julio 2008, 17:24 »

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!

Código:
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 Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #7 en: 02 Julio 2008, 23:42 »

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 Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #8 en: 03 Julio 2008, 16:01 »

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.png

Haber 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 Desconectado

Mensajes: 261

"Las estrellas se apagan..."


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #9 en: 03 Julio 2008, 20:34 »

En el accept tienes el casting mal. Seria asi:

Código:
accept(Des_Server,(struct sockaddr *)&conexion,&tamano)

Saludos
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Sarkis

Desconectado Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #10 en: 03 Julio 2008, 21:01 »

En el accept tienes el casting mal. Seria asi:

Código:
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  ;D

Gracias.
En línea



.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
Sarkis

Desconectado Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #11 en: 04 Julio 2008, 12:20 »

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:

Código:
#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

Código:
#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 Desconectado

Mensajes: 261

"Las estrellas se apagan..."


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #12 en: 04 Julio 2008, 17:16 »

Código:
char cadena;
Código:
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:

Código:
char cadena_recibida;
Código:
printf ("%s", cadena_recibida);

Aqui da el fallo de segmentacion.

Como ves, no es tema de sockets, es algo mas basico  :P

Saludos
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Sarkis

Desconectado Desconectado

Mensajes: 532


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #13 en: 04 Julio 2008, 20:43 »

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

Conectado Conectado

Mensajes: 256



Ver Perfil WWW
Re: Duda IP cliente servidor.
« Respuesta #14 en: 04 Julio 2008, 22:17 »

cuando haces char cadena[256]; esa variable tiene basura, hazle un memset(&cadena, 0, sizeof(cadena)); y deberian de desaparecer esos caracteres basura  :xD
En línea

GunZTracker - Codeado entero en Visual Basic 6

www.gunztracker.com

Páginas: [1] 2 Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC
Free counter and web stats