#include <sys/socket.h> // socket, send, recv. . .
#include <netinet/in.h> // sockaddr_in, htons, htonl, etc.
#include <arpa/inet.h> // inet_addr
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "tipos.h"
int main(int argc,char* argv[])
{
int socketescm, sockDatos, sockEsc, ret, i, puerto;
struct sockaddr_in dir;
struct sockaddr_in dircliente;
int tamanio ,suma_par ,suma_impar;
Vector elementos; // es un vector de datos (enteros) que se ha definido en tipos.x
FILE *f;
XDR operacion;
float resultado;
int n, numero;
casos Mens;
printf("\nServidor en funcionamiento!!");
// Comprobacion de que se introduzca el puerto por linea de comandos
if(argc<2)
{
printf("Error. Puerto no especificado.");
exit (-1);
}
else
{
puerto=atoi(argv[1]);
printf("\nUtilizando el puerto:%d\n",puerto);
}
// Creacion socket de escucha
sockEsc=socket(PF_INET, SOCK_STREAM, 0);
dir.sin_family=AF_INET;
dir.sin_port=htons(puerto);
dir.sin_addr.s_addr=htonl(INADDR_ANY);
ret=bind(sockEsc,(struct sockaddr *)&dir, sizeof(dir));
if (ret==-1)
{
perror("Al asignar direccion\n");
close(sockEsc);
exit(-1);
}
// Poner socket en modo escucha
ret=listen(sockEsc, SOMAXCONN);
if (ret==-1)
{
perror("Al poner en modo escucha");
close(sockEsc);
exit(-1);
}
while(1)
{
tamanio=sizeof(dircliente);
printf("Esperando por clientes........\n");
sockDatos = accept(sockEsc,(struct sockaddr *)&dircliente,&tamanio);
if (sockDatos == -1)
{
perror("Error en accept\n");
exit(-1);
}
printf("Se ha conectado un cliente\n");
elementos.Vector_val=NULL;
f=fdopen(sockDatos,"r+");
if(f==NULL)
{
printf("Error al leer los datos\n");
exit(-1);
}
xdrstdio_create(&operacion,f,XDR_DECODE);
if(xdr_Vector(&operacion,&elementos)!=TRUE)
{
printf("Error al decodificar la estructura\n");
exit(-1);
}
if(elementos.Vector_len!=0)
{
printf("El numero de elementos es: %d\n",elementos.Vector_len);
i=0;
suma_par=0;
suma_impar=0;
while(i<elementos.Vector_len)
{
numero = elementos.Vector_val[i];
if(numero%2==1){
suma_impar=suma_impar+numero;
}
else{
suma_par=suma_par+numero;
}
i++;
}
printf("suma_par: %d --- suma_impar: %d",suma_par,suma_impar);
//ahora codificamos en XDR
if(suma_impar==0)
{
Mens.tipo=1;
Mens.casos_u.Mensaje="Error:division por 0";
}
else
{
resultado=(float)suma_par/(float)suma_impar;
Mens.tipo=2;
Mens.casos_u.Cociente=resultado;
}
}// fin 'if'
else
{
Mens.tipo=1;
Mens.casos_u.Mensaje="Error: no has introducido datos\n";
}
f=fdopen(sockDatos,"w+");
xdrstdio_create(&operacion,f,XDR_ENCODE);
if(xdr_casos(&operacion,&Mens)!=TRUE)
{
printf("Error al codificar los datos\n");
}
fflush(f);
fclose(f);
if(suma_impar!=0)
xdr_free((xdrproc_t) xdr_Vector,(char*) elementos.Vector_val);
close(sockDatos);
}// fin 'while'
}//fin 'main'