Código:
SERVIDOR.C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define P_SIZE sizeof(struct pmensaje) struct pmensaje{ int mensaje; //tipo de operacion que debe hacer el cliente int idNeurona; //identificacion del cliente int cOrigen; //capa de origen del mensaje int cDestino; //capa de destino del mensaje int nDestino; //neurona destino int capa; //nro de capa en la que estoy float valor; //valor }; struct pcliente{ int sd; struct sockaddr_in cli; socklen_t lon; }; void impresiones(int opcion){ switch (opcion){ case 1: printf("****************************************************************\n"); printf("*** SERVIDOR INICIADO ***\n"); printf("****************************************************************\n"); break; case 2: printf("****************************************************************\n"); printf("*** SERVIDOR FINALIZADO ***\n"); printf("****************************************************************\n"); break; default: printf(""); break; } } int enviar(char *param, struct pmensaje *m, int puerto){ int sd; socklen_t lon; struct sockaddr_in server; struct hostent *h; server.sin_family = AF_INET; server.sin_port = htons(puerto); if (h = gethostbyname("localhost")){ memcpy(&server.sin_addr, h->h_addr, h->h_length); }else{ printf("No se encontró %s\n", param); } sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); lon = sizeof(server); if(connect(sd, (struct sockaddr *)&server, lon)<0){ perror("Connect"); exit(-1); } send(sd, m, P_SIZE, 0); return 0; } int reenviar(int sd, char *param,struct pmensaje *m){ int ok, d; switch (m->cOrigen){ //capa origen = 1 => enviar a todos los de capa 2 case 1: enviar(param, m, 4021); enviar(param, m, 4022); enviar(param, m, 4023); break; //capa origen = 2 => envio a capa 1 o 3 (mismo cliente) case 2: enviar(param, m, 4001); break; //capa origen = 3 => enviar a todos los de capa 2 case 3: d = m->nDestino; // m->nDestino = 1; switch(d){ case 3: enviar(param, m, 4021); break; case 4: enviar(param, m, 4022); break; case 5: enviar(param, m, 4023); break; } default: ok = -1; break; } sleep(1); printf("Redireccionando mensaje de capa %i a capa %i de idNeurona %i\n", m->cOrigen,m->cDestino, m->idNeurona); return ok; } int main(int argc, char *argv[]){ int i,j; int pid; int sd; int sdcli; int clientes[10]; char buffer[P_SIZE]; socklen_t lon; struct sockaddr_in server; struct sockaddr_in cliente; struct pmensaje *mensaje; system("clear"); argv[1] = "localhost"; impresiones(1); server.sin_family = AF_INET; server.sin_port = htons(4000); server.sin_addr.s_addr = INADDR_ANY; sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if ((bind(sd, (struct sockaddr *) &server, sizeof(server)))<0){ perror("BIND: "); exit(-1); } listen(sd, 100); i = 0; while (1){ lon = sizeof(cliente); sdcli = accept(sd, (struct sockaddr *) &cliente, &lon); pid = fork(); if (pid == 0){ close(sd); recv(sdcli, buffer, P_SIZE, 0); mensaje = (struct pmensaje *) buffer; if (i<=3){ printf("El número de clientes es %i \n*******************************\n",i+1); switch (i){ case 0: mensaje->capa = 4001; break; case 1: mensaje->capa = 4021; break; case 2: mensaje->capa = 4022; break; case 3: mensaje->capa = 4023; break; } send(sdcli, mensaje, P_SIZE, 0); } if (i == 3){ mensaje->mensaje = 100; enviar("localhost", mensaje,4001); enviar("localhost", mensaje,4021); enviar("localhost", mensaje,4022); enviar("localhost", mensaje,4023); } if (i > 3){ reenviar(sd, "localhost",mensaje); } close(sdcli); exit(0); }else{ i++; close(sdcli); } } close(sd); return 0; }