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



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  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 603 veces)
Sarkis

Conectado Conectado

Mensajes: 527


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #15 en: 05 Julio 2008, 00:14 »

Lo acabo de hacer pero sigue saliendo lo mismo, puede que tenga algo mal.

Servidor:

Código:
#include <stdio.h>
#include <string.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 [256];
    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.");
    }

    memset(&cadena, 0, sizeof(cadena));
    printf ("Introduzca un mensaje: ");
    scanf ("%s", &cadena);
    send (Descriptor_Servidor, 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 [256];
    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, cadena_recibida, sizeof (cadena_recibida), 0);
    printf ("%s", cadena_recibida);

    close(Descriptor_Cliente);
}

Imágen del problema:



---> http://img93.imageshack.us/img93/8940/pantallazoqj6.png

Saludos
« Última modificación: 05 Julio 2008, 00:17 por sarkis » 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 #16 en: 05 Julio 2008, 06:13 »

Hay varios problemas! el mas grave es que estas intetando mandar informacion por el socket donde escucha el servidor "Descriptor_Servidor" y no por el del cliente "Descriptor_Cliente", fijate en el "send()" cambia eso y ahi anda un poco mejor pero no del todo!
Otro problema es q "sizeof()" te da el tamaño de la variable, q en la mayoria de los casos no es la cantidad de bytes que queres mandar i.e. si queres mandar "hola" solo vas a mandar 4 bytes en ves de los 256 q tiene la variable (**SOLUCION_1), sumado a esto esta el problema de q no inicializas las variables "cadena" ni "cadena_recibida" lo q hace q se manden los 256 bytes q hay en "cadena" (los 4 nesesario mas la basura) y cuando recibes esta bsaura se suma a la q hay en "cadena_recibida" y bueeee ya en ese puento ves cualquier cosa menos lo q mandaste jajaja!! (**SOLUCION_2).

(**SOLUCION_1):
Para esto podes usar la funcion "strlen(char *)" q te dice la cantidad de caracteres (bytes en este caso) que tiene la cadena (sin contar el terminador 0, para mas info "man strlen"). Esto no es muy recomendado en tranferencias por la red debido a la alta probabilidad de q se despilfarre un byte y se vuelva cero y ahi muere la funcion jaja! pero bue! si estas seguro de q eso no pasa como en este caso q lees del stdin no hay drama! donde nucna deberias usarlo es del lado donde recibes la info!


(**SOLUCION_2):
Para este caso deberias inicializar las variables con ceros como dice "Lambda".
Otra opcion, y para mi la mas bonita, es pedir memoria con "calloc()" q ya te la da inicializada y luego liberarla! Es mejor y mas bonito laburar con memoria dinamica, en programas chicos no sirve tanto pero en un programa piola si y es bueno ir acostumbrandose desde ""chico"" jaja!!

saludos!!
En línea
dooque

Desconectado Desconectado

Mensajes: 68


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #17 en: 05 Julio 2008, 06:19 »

Haa y otra cosa q me olvidaba es q no miras los valores q devuelven las funciones "send" y "recv", si no quieres controlar la cantidad de bytes q se envian/reciben no importa (aunque deberias) pero si deberias diferenciar entre los tres casos mas importantes:
si devuelven un valor positivo es q algo se transfirio!
si devuelve 0 es que la otra parte cerro la conexion!
si devuelve -1 es q hubo un error! si ubieras contemplado este caso te ubieras dado cuenta al salto del problema!

saludos!
En línea
Sarkis

Conectado Conectado

Mensajes: 527


C/C++ Programmer...


Ver Perfil
Re: Duda IP cliente servidor.
« Respuesta #18 en: 05 Julio 2008, 12:51 »

Muchisimas gracias dooque, Lambda, Leber...

Algo hice anoche con ayuda de vuestros conocimientos. El mensaje se envía muy bien y el cliente lo recibe perfectamente. Puse las evaluaciones con un if para saber si se envia bien o no el mensaje y si la conexión se mantiene correcta.

Bueno, aquí dejo los codes, espero que si tengo más dudas respondáis de esa manera tán rapida y amable como lo habeis hecho hasta ahora.

Servidor:

Código:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int Descriptor_Servidor, Descriptor_Cliente, Estado_Envio;
    unsigned int tamano_sockaddr = sizeof(struct sockaddr);
    int PUERTO = 6000;
    char cadena[256];
    struct sockaddr_in conexion;

    Descriptor_Servidor = socket(PF_INET, SOCK_STREAM, 0);
    if (Descriptor_Servidor == -1) {
printf("Error: No se ha podido abrir el socket servidor.");
    }

    conexion.sin_family = PF_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.");
    }

    memset(&cadena, 0, strlen(cadena));
    printf("Introduzca un mensaje: ");
    gets(cadena);
    Estado_Envio = send(Descriptor_Cliente, cadena, strlen(cadena), 0);

    if (Estado_Envio == 0) {
printf("Error: Se ha cerrado la conexión.");
    }
    if (Estado_Envio == -1) {
printf("Error: No se ha podido enviar el mensaje.");
    }

    close(Descriptor_Servidor);
    close(Descriptor_Cliente);

    return (0);

}

Cliente:

Código:
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define IP "127.0.0.1"

int main()
{

    int Descriptor_Cliente, Estado_Recibo;
    int PUERTO = 6000;
    int Estado_Conexion;
    char cadena_recibida[256];
    struct sockaddr_in conexion;

    Descriptor_Cliente = socket(PF_INET, SOCK_STREAM, 0);
    if (Descriptor_Cliente == -1) {
printf("Error: No se ha podido abrir el socket cliente.");
    }

    conexion.sin_family = PF_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.");
    }

    memset(&cadena_recibida, 0, sizeof(cadena_recibida));
    Estado_Recibo =
recv(Descriptor_Cliente, cadena_recibida, sizeof(cadena_recibida),
     0);
    printf("Servidor dice: %s\n", cadena_recibida);

    if (Estado_Recibo == 0) {
printf("Error: Se ha cerrado la conexión.");
    }
    if (Estado_Recibo == -1) {
printf("Error: No se ha podido recibir el mensaje.");
    }

    close(Descriptor_Cliente);

    return (0);

}

Saludos y muchisimas gracias.  :)

PD: Si le pedimos al cliente la IP a la cual conectarse para almacenarla en una variable y pasarsela a la estructura sockaddr_in...De qué tipo de dato debe ser la variable en la que se debe almacenar la IP? Estoy un poco perdido con eso.
« Última modificación: 05 Julio 2008, 15:34 por sarkis » 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 #19 en: 05 Julio 2008, 15:38 »

PD: Si le pedimos al cliente la IP a la cual conectarse para almacenarla en una variable y pasarsela a la estructura sockaddr_in...De qué tipo de dato debe ser la variable en la que se debe almacenar la IP? Estoy un poco perdido con eso.

si lo va a pasar en la forma decimal con punto seria un "char *"

saludos
En línea
Sarkis

Conectado Conectado

Mensajes: 527


C/C++ Programmer...


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

Gracias dooque.

Saludos  ;)
En línea



.::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
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