Tema: sockets
Ver Mensaje Individual
  #3 (permalink)  
Antiguo 23/11/2013, 17:04
marcelofb
 
Fecha de Ingreso: noviembre-2013
Mensajes: 3
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: sockets

CLIENTE.C (continuación)

Código:
/**
 * Emula la operatoria de la capa oculta
 */
int operatoriaCapaOculta(struct sockaddr_in local,int sd,  int sdcli, int puerto){
	char buffer[P_SIZE];
	char buffer2[P_SIZE_2];
	int phi = 3;
	int i, lon;
	struct pmensaje *mensaje;
	struct pneurona *n1;
	double umbral = 1;
	double delta;
	double suma;
	int deC1 = 0, deC2 = 0; //variables que indican la cant de paquetes recibidos de c/capa

	mensaje = (struct pmensaje *) buffer;
	n1 = (struct pneurona *) buffer2;
	inicializar(n1, 1, puerto);
	imprimirNeurona(n1,2);
	while(1){


			lon = sizeof(local);
			sdcli = accept(sd, (struct sockaddr *) &local, &lon);
			recv(sdcli, mensaje, P_SIZE, 0);

			imprimirMensaje(mensaje);

			//Si el mensaje es recibido de la capa 1 y esta dirigido a la capa 2, armo y envio el mensaje para la capa 3
			if ((mensaje->cOrigen == 1) && (mensaje->cDestino == 2)){
				n1->valores[mensaje->idNeurona - 1] = mensaje->valor;
				deC1++;

				if(deC1 == 2){
					mensaje->cOrigen = 2;
					mensaje->cDestino = 3;
					mensaje->idNeurona = n1->idNeurona;
					mensaje->nDestino = 1;
					mensaje->valor = fgnet(gnet(n1->pesos, n1->valores, deC1, umbral));
					enviar("localhost", mensaje, 4000);
					deC1 = 0;
					printf("Mensaje enviado a capa 3\n");
				}


			}

			if((mensaje->cOrigen == 3) && (mensaje->cDestino == 2)){
				imprimirNeurona(n1,2);
				printf("Corrigiendo pesos...\n");
				suma = 0;

				for (i=0;i<2;i++){
					suma +=mensaje->valor*n1->pesos[i];
				}

				delta = deltak(gnet(n1->pesos, n1->valores, 2, umbral), suma);

				for (i=0;i<2;i++){
						n1->pesos[0] += delta*phi*fgnet(gnet(n1->pesos, n1->valores, 2, umbral));
				}
				imprimirNeurona(n1,2);

				mensaje->cOrigen = 2;
				mensaje->cDestino = 1;
				mensaje->idNeurona = n1->idNeurona;
				mensaje->valor = delta;

				enviar("localhost", mensaje, 4000);
			}

	}


return 0;

}


int main(int argc, char *argv[]){
	int sd, sdcli,salir, i, j;
	char teclado[255];
	char buffer[P_SIZE];
	char buffer2[P_SIZE_2];
	struct hostent *h;
	struct pmensaje *mensaje;
	struct sockaddr_in remoto, local;
	socklen_t lon;


	system("clear");
	
		argv[1] = "localhost";
	

	mensaje = (struct pmensaje *) buffer;
	mensaje->capa = htons(1);
	mensaje->valor = 0.5;

	saludo(argv[1], mensaje);

	remoto.sin_family = AF_INET;
	remoto.sin_port = htons(mensaje->capa);
	remoto.sin_addr.s_addr = INADDR_ANY;


	sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if ((bind(sd, (struct sockaddr *) &remoto, sizeof(remoto)))<0){
		perror("BIND: ");
		exit(-1);
	}

	listen(sd, 10);
	i = 0;
	salir = 0;
	printf("Estoy escuchando por el puerto %i\n", mensaje->capa);

	while(!salir){
		lon = sizeof(local);
		sdcli = accept(sd, (struct sockaddr *) &local, &lon);
		recv(sdcli, mensaje, P_SIZE, 0);

		if (mensaje->mensaje == 100){
			if (ntohs(remoto.sin_port) == 4001){
				salir = operatoriaCapaMixta(local, sd, sdcli);
			}else{
				operatoriaCapaOculta(local,sd, sdcli, ntohs(remoto.sin_port));
			}
		}
	}
	close(sdcli);
	close(sd);

}