Hola, que triste que mi primer mensaje sea para preguntar y no para responder y echar una mano, pero ya llevo mucho tiempo con estos sockets.
Son cliente y servidor y no tengo ni idea de qué falla en el cliente, el servidor parece funcionar, al menos se queda parado en ejecución (supongo que esperando la petición del cliente, que nunca llega).
Os agradecería enormemente un cable si alguien sabe qué puede estar fallando...
Os adjunto primero el código del cliente, y luego el del servidor.
//Este es el CLIENTE de la comunicacion entre procesos:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void error(const char *msg)
{
perror(msg);
exit(0);
}
int main(void)
{
int indentificador_de_socket, numero_de_puerto;
struct sockaddr_in direccion_del_servidor;
struct hostent *servidor;
char *datos;
int n;
FILE *pf;
char ch; int i;
pf=fopen(datos,"r");//el primer parametro es el nombre del fichero a abrir
//si el fichero no existe, se produce error de apertura, o lo que es lo mismo, no hay nada que desencriptar
bzero((char *) &direccion_del_servidor, sizeof(direccion_del_servidor));
direccion_del_servidor.sin_addr.s_addr = htonl(INADDR_ANY);
direccion_del_servidor.sin_family = AF_INET;
direccion_del_servidor.sin_port = htons(5001);
indentificador_de_socket = socket(AF_INET, SOCK_STREAM, 0);
if (indentificador_de_socket < 0)
printf("ERROR de apertura de socket en el cliente\n");
if (connect(indentificador_de_socket,(struct sockaddr *)&direccion_del_servidor,sizeof(direccion_del_servidor)) < 0)
/*printf*/error("ERROR en la conexion\n");
else
printf("Conexion establecida desde el cliente con el servidor\n");
//AQUI LO QUE HACEMOS ES LEER EL CONTENIDO DEL FICHERO QUE SE QUIERE ENVIAR, ALMACENARLO EN UN ARRAY O SIMILAR Y ENVIARLO a nuestro socket servidor como una cadena de texto
//LEEMOS LOS DATOS Y LOS GUARDAMOS en el array indefinido datos
ch=fgetc(pf);
for(i=0; ch!=EOF; i++)
{
datos[i]=ch;
datos=(char *)realloc(datos, i + 1);
ch=fgetc(pf);
}
n = write(indentificador_de_socket, datos, strlen(datos));
if (n < 0)
printf("ERROR al escribir en el socket cliente\n");
close(indentificador_de_socket);
fclose(pf);
return 0;
}
//Este es el SERVIDOR de la comunicacion entre procesos:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void)
{
int identificador_de_socket, nuevo_identificador_de_socket, numero_de_puerto;
char *datos;
struct sockaddr_in direccion_del_servidor, direccion_del_cliente;
int n;
int longitud;
identificador_de_socket = socket(AF_INET, SOCK_STREAM, 0);
if (identificador_de_socket < 0)
printf("ERROR de apertura de socket en el servidor\n");
bzero((char *) &direccion_del_servidor, sizeof(direccion_del_servidor));
direccion_del_servidor.sin_family = AF_INET;
direccion_del_servidor.sin_addr.s_addr = htonl(INADDR_ANY);
direccion_del_servidor.sin_port = htons(0);
if (bind(identificador_de_socket, (struct sockaddr *) &direccion_del_servidor, sizeof(direccion_del_servidor)) < 0)
printf("ERROR en la conexion\n");
listen(identificador_de_socket,5);
longitud = sizeof(struct sockaddr);
nuevo_identificador_de_socket = accept(identificador_de_socket, (struct sockaddr *) &direccion_del_cliente, &longitud);
if (nuevo_identificador_de_socket < 0)
printf("ERROR en aceptar\n");
bzero(datos,sizeof(datos));
n = read(nuevo_identificador_de_socket,datos,sizeof(datos));
if (n < 0)
printf("ERROR al leer del socket\n");
printf("Aqui esta el mensaje obtenido por el socket cliente: %s\n",datos);
n = write(nuevo_identificador_de_socket, "Tengo el mensaje xD", 21);//este codigo simplemente escribe un mensaje corto de confirmacion al cliente
if (n < 0)
printf("ERROR al escribir en el socket\n");
close(nuevo_identificador_de_socket);
close(identificador_de_socket);
getchar();
return 0;
}
Muchísimas gracias.
Un saludo.