//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;}