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
SERVIDOR
Código: c
Los dos programas los estoy corriendo en ubuntu, los dos, con la ip de mi red domestica (192.168.xxx.xxx)
el codigo:
CLIENTE
#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
#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;
}