23/11/2013, 17:04
|
| | 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);
}
|