[SOLUCIONADO] Problemas send/recv en C de ubuntu

Iniciado por franxi2953, Julio 09, 2011, 09:36:04 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 09, 2011, 09:36:04 AM Ultima modificación: Febrero 04, 2015, 10:23:25 PM por Expermicid
Bueno la cosa es que estoy haciendo un servidor/cliente en C, me han surgido bastantes errores pero los he ido arreglando hasta ahora, me pasa una cosa rarisima con el primer send que hago en el codigo, el fin de este send es enviar la longitud de la cadena que se mandara posteriormente, pero al iniciar ambos programas el servidor (donde esta el send) no envia nada y sale del programa sin haber ningun return.

Los dos programas los estoy corriendo en ubuntu, los dos, con la ip de mi red domestica (192.168.xxx.xxx)

el codigo:

CLIENTE

Código: c

#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>





int main (void)
{
    int sockfd,leido, longitud, total=0;
    struct addrinfo datos, *GuardarDatos;
    char *cadena;

    memset(&datos, '0', sizeof(struct addrinfo));

    datos.ai_family=AF_INET;
    datos.ai_socktype=SOCK_STREAM;
    datos.ai_protocol=0;
    datos.ai_flags=AI_PASSIVE;

    getaddrinfo("192.168.xxx.xxx","9000", &datos, &GuardarDatos);

    sockfd=socket(GuardarDatos->ai_family, GuardarDatos->ai_socktype,   GuardarDatos->ai_protocol);

    if(sockfd == -1)
    {
        printf("\nError al abrir el socket (funcion socket)\n");
        return -1;
    }

    if(connect(sockfd, GuardarDatos->ai_addr, GuardarDatos->ai_addrlen) == -1)
    {
        printf("\nConexion fallida (fallo en connect)\n");
        return -1;
    }

    leido=recv(sockfd, &longitud, sizeof(int), 0);

    if (leido == 0)
    {
        printf("\nError se ha hallado el socket cerrado\n al intentar obtener la longitud del mensaje\n");
        return -1;
    }

    cadena=(char *)malloc(longitud);

    while(longitud < total)
    {
        leido=recv(sockfd, &cadena[total], longitud-total, 0);
        total=total+leido;

        if (leido == 0)
        {
            printf("\nError se ha hallado el socket cerrado\n al intentar obtener el mensaje\n");
            return -1;
        }
    }

    printf("\nEl mensaje es: %s\n", cadena);

    free (cadena);
    freeaddrinfo(GuardarDatos);
    close(sockfd);

    printf("\nPulse una tecla para finalizar\n");
    fflush(stdin);
    getchar();
    return 0;
}     

     


SERVIDOR

Código: c
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<errno.h>



int main(void)
{
    int sockfd, acceptfd, total=0, escrito;
    struct addrinfo datos, *GuardarDatos;
    struct sockaddr_in cliente;
    socklen_t TamanoCliente=sizeof(struct sockaddr_in);
    char *cadena=(char *)malloc(12);
    ssize_t lcadena;

    memset(&datos, 0, sizeof(struct addrinfo));
    memset(GuardarDatos, 0, sizeof(struct addrinfo));

    printf("\nPor favor intoduzca la cadena a enviar:");
    fgets(cadena,12*sizeof(char),stdin);
    printf("\n");

    lcadena=strlen(cadena);

    datos.ai_socktype=SOCK_STREAM;
    datos.ai_family=AF_INET;
    datos.ai_protocol=0;
    datos.ai_flags=AI_PASSIVE;

    getaddrinfo("192.168.xxx.xxx","9000",&datos,&GuardarDatos);

    sockfd=socket(datos.ai_family, datos.ai_socktype, datos.ai_protocol);
    if (sockfd == -1)
    { 
        printf("\nerror en socket\n");
        return -1;
    }

    if(bind(sockfd, GuardarDatos->ai_addr, GuardarDatos->ai_addrlen)==-1)
    {
        printf("\nerror en bind\n");
        return -1;
    }

    printf("\nPoniendo socket a la escucha...\n");

    if(listen(sockfd, 1)==-1)
    {
        printf("\nerror en listen\n");
        return -1;
    }

    acceptfd=accept(sockfd, (struct sockaddr*)&cliente, &TamanoCliente);

    if(acceptfd==-1)
    {
        printf("\nerror en accept\n");
        return -1;
    }

    escrito=send(sockfd, &lcadena, 1, 0); 

    if (escrito == 0)
    {
        printf("\nError, no se ha podido mandar el mensaje\n");
        return -1;
    }

    while(total<leido)
    {
        escrito=send(sockfd, &cadena[total], lcadena-total, 0);
        total=total + escrito;
    }
    printf("\ndespues del while\n");

        if(leido > lcadena)
    {
        printf("\nError, no se ha podido enviar la cadena completa\n");
        return -1;
    }

    close(sockfd);     

    printf("\nSe ha enviado su caracter correctamente\nPulse una tecla para finalizar\n");
    fflush(stdin);
    getchar();
   
    return 0;
}

la variable total en el cliente no esta setiada, otra cosa, puedes probar a conectar con tu servidor con netcat, para hacer las pruebas.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Julio 14, 2011, 04:14:25 PM #2 Ultima modificación: Julio 14, 2011, 04:19:21 PM por franxi2953
con ponerla a 0 no basta, tengo que hacer un memset??

EDITO:sigue = con el memset u.u