• Jueves 25 de Abril de 2024, 14:08

Autor Tema:  Error socket cliente  (Leído 1716 veces)

CdeC

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Error socket cliente
« en: Miércoles 22 de Enero de 2014, 13:01 »
0
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.  :losiento: 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). :lightsabre:

Os agradecería enormemente un cable si alguien sabe qué puede estar fallando... :question:
Os adjunto primero el código del cliente, y luego el del servidor.

Código: [Seleccionar]
//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;
}

Código: [Seleccionar]
//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;
}

 :kicking:

Muchísimas gracias.
Un saludo. :gracias: