Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - franxi2953

#1
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;
}
#2
bueno los que suelen meterse a irc estaran ya artos de mis dudas de c   :)

la cosa es que esta vez no habia nadie que supiera de c conectado y ANTRAX me recomendo preguntar aqui asi que:

si yo tengo una cadena char *cadena, a la que he reservado memoria con malloc y le hago un memset(cadena, 0, strlen(cadena)), se llena toda la cadena de 0 no?,  si yo luego lleno la mitad de la cadena, la otra mitad sigue con 0 como quedaria? asi ([h][una o][l][a][m][una u][n][d][una o][\0][0][0])? si le hago un printf por ejemplo, aparecen estos 0 o solo hasta \0?? y si le hago un fwrite??