#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include "funciones.c"
void quitHandler(int sig);
int socketDes=-1; //socket del servidor
int main(void)
{
/*---------------------------------------
Descriptor del socket y buffer de datos
---------------------------------------*/
struct sockaddr_in sockname, from;
char buffer[200];
int from_len;
struct hostent* host;
/*-----------------
Se abre el socket
-----------------*/
socketDes = socket (AF_INET, SOCK_STREAM, 0);
if (socketDes == -1)
{
perror ("No se puede abrir el socket servidor"); }
/*------------------------------------------------------
Se rellenan los campos de la estructura con la IP del
servidor y el puerto del servicio que ofrecemos
------------------------------------------------------*/
sockname.sin_family = AF_INET;
sockname.sin_port = htons(2050);
sockname.sin_addr.s_addr = INADDR_ANY;
if (bind (socketDes, (struct sockaddr*)&sockname, sizeof(sockname)) == -1)
{
perror("Error en la operacion bind"); close (socketDes);
}
from_len = sizeof(from);
if (listen(socketDes,1) == -1)
{
perror("Error en la operacion de listen"); close (socketDes);
}
signal(SIGINT, quitHandler);
signal(SIGTSTP, quitHandler);
/*--------------------------------
Aceptar peticiones de clientes
-------------------------------*/
char **refranes;
int numRefranes;
struct cliente infoCli;
int infoSelect;
int numClientesIn=0;
int socketEntrada, newSocket;
int i=0,j=0;
char kword[30];
char bufferAux[200];
char *cadAux, *cadAux1;
int index=0, index1=0;
char letra;
struct cliente auxCli;
fd_set sockIn;
fd_set sockAux;
FD_ZERO(&sockIn);
FD_ZERO(&sockAux);
FD_SET(socketDes,&sockIn);
refranes=extraeRefranes(&numRefranes); //cargamos refranes desde fichero
while(1) //bucle para el continuo analisis de peticiones de entrada
{
sockAux=sockIn; //FD_COPY(&sockIn, &sockAux);
infoSelect=select(FD_SETSIZE,&sockIn,NULL,NULL,NULL);
if(infoSelect==-1)
{
perror("\nError en la funcion select()\n"); }
else
{
socketEntrada=buscarSocket(&sockIn);
if(socketEntrada>=0)
{
if(recv(socketEntrada,buffer,200,0)==-1)
printf("\nError en la recepcion con -recv-\n"); else
{
i=0;
do
{
kword[i]=buffer[i];
i++;
}while(buffer[i]!=' ' && buffer[i]!='\0');
kword[i]='\0';
if(strcmp(kword
, "USUARIO")==0) //se introdujo la clave USUARIO {
cadAux=buffer+8;
auxCli=buscaClienteNombre(cadAux);
if(auxCli.registrado!=1)
{
strcpy(buffer
,"-Err. Usuario incorrecto"); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nSe produjo un erro al enviar\n"); }
else
{
if(auxCli.loggeado!=1)
{
auxCli.loggeado=1;
auxCli.numSocket= socketEntrada;
modificarCliente(auxCli);
}
strcpy(buffer
,"-Ok. Usuario correcto"); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nSe produjo un erro al enviar\n"); }
}//fin opcion USUARIO
if(strcmp(kword
,"PASSWORD")==0) //se introdujo la clav PASSWORD {
cadAux=buffer+9; //esta es la contraseña
auxCli=buscaCliente(socketEntrada);
//puede ser NULL??????????????????????
if(auxCli.
loggeado==1 && (strcmp(auxCli.
passUser,cadAux
)==0)) {
strcpy(buffer
, "+Ok. Usuario validado"); if(send(socketEntrada, buffer, 200, 0) == -1)
modificarCliente(auxCli); //se incluye la informacion en el fichero
}
else
{
strcpy(buffer
, "-Err. Error en la validacion"); if(send(socketEntrada, buffer, 200, 0) == -1)
}
}//fin opcion PASSWORD
if(strcmp(kword
,"REGISTRO")==0) //se introdujo la clave REGISTRO {
for(i
=0;i
<=strlen(buffer
);i
++) {
if(buffer[i]=='-' && buffer[i+1]=='u')
{
index=i+3;
cadAux=buffer+index; //aqui esta el usuario
}
if(buffer[i]=='-' && buffer[i+1]=='p')
{
cadAux1=buffer+(i+3); //aqui la contraseña
index1=i;
}
}
cadAux[index1-index-1]='\0';
auxCli=buscaClienteNombre(cadAux);
if(auxCli.registrado!=1)
{
auxCli.numSocket=0;
auxCli.jugando=0;
auxCli.registrado=1;
auxCli.loggeado=0;
auxCli.autenticado=0;
strcpy(auxCli.
nombreUser,cadAux
); strcpy(auxCli.
passUser,cadAux1
); auxCli.puntuacionPartida=0;
auxCli.puntuacionTotal=0;
auxCli.numIntentos=0;
auxCli.numeroRefran=-1;
auxCli.frasesAcertadas=0;
auxCli.frasesFalladas=0;
auxCli.modoJuego=-1;
introduceCliente(auxCli);
strcpy(buffer
,"+Ok. Usuario registrado"); if(send(socketEntrada,buffer,200,0)==-1)
perror("Error envio confirmacion registro"); }
else
{
strcpy(buffer
,"-Err. Usuario ya existe"); if(send(socketEntrada,buffer,200,0)==-1)
perror("Error envio respuesta registro"); }
} //fin opcion registro
{
auxCli=buscaCliente(socketEntrada);
letra=buffer[6];
if(letra=='a' || letra=='e' || letra=='i' || letra=='o' || letra=='u')
{
if(auxCli.modoJuego==0)
{
if(compruebaLetra(refranes[auxCli.numeroRefran], auxCli.frasePartida, letra)==1)
{
strcpy(buffer
,"+Ok. Existe la vocal ---> "); strcat(buffer
,auxCli.
frasePartida); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError al enviar confirmacion vocal\n"); }
else
{
strcpy(buffer
,"-Err. No existe la vocal ---> "); strcat(buffer
,auxCli.
frasePartida); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError al enviar confirmacion vocal\n"); }
auxCli.numIntentos++;
}
}
else
{
strcpy(buffer
,"-Err. Mensaje invalido"); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError al enviar mensaje error\n"); }
} //fin opcion VOCAL
if(strcmp(kword
,"CONSONANTE")==0) {
auxCli=buscaCliente(socketEntrada);
letra=buffer[11];
if(letra!='a' && letra!='e' && letra!='i' && letra!='o' && letra!='u')
{
if(auxCli.modoJuego==0)
{
if(compruebaLetra(refranes[auxCli.numeroRefran], auxCli.frasePartida, letra)==1)
{
strcpy(buffer
,"+Ok. Existe la consonante ---> "); strcat(buffer
,auxCli.
frasePartida); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError al enviar confirmacion consonante\n"); }
else
{
strcpy(buffer
,"-Err. No existe la consonante ---> "); strcat(buffer
,auxCli.
frasePartida); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError al enviar confirmacion consonante\n"); }
auxCli.numIntentos++;
}
}
else
{
strcpy(buffer
,"-Err. Mensaje invalido"); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError al enviar mensaje error\n"); }
} //fin opcion CONSONANTE
if(strcmp(kword
,"RESOLVER")==0) {
auxCli=buscaCliente(socketEntrada);
if(auxCli.modoJuego==0)
{
if(strcmp(buffer
+9,refranes
[auxCli.
numeroRefran])==0) {
if(auxCli.numIntentos<5)
auxCli.puntuacionPartida=150;
if(auxCli.numIntentos>=5 && auxCli.numIntentos<=8)
auxCli.puntuacionPartida=100;
if(auxCli.numIntentos>=9 && auxCli.numIntentos<=11)
auxCli.puntuacionPartida=70;
if(auxCli.numIntentos>=12 && auxCli.numIntentos<=15)
auxCli.puntuacionPartida=50;
if(auxCli.numIntentos>15)
auxCli.puntuacionPartida=0;
auxCli.frasesAcertadas++;
auxCli.puntuacionTotal+=auxCli.puntuacionPartida;
sprintf(bufferAux
,"+Ok. Enhorabuena\n\n Puntuacion en esta partida: %d\nPuntuacion total: %d\nIntentos realizados: %d\nFrases acertadas: %d\nFrases fallidas: %d",auxCli.
puntuacionPartida,auxCli.
puntuacionTotal,auxCli.
numIntentos,auxCli.
frasesAcertadas,auxCli.
frasesFalladas); auxCli.puntuacionPartida=0;
if(send(socketEntrada,bufferAux,200,0)==-1)
perror("\nError al enviar estadisticas\n"); }
else
{
auxCli.frasesFalladas++;
sprintf(bufferAux
,"-Err. Mejor suerte la proxima vez\n\n Puntuacion en esta partida: %d\nPuntuacion total: %d\nIntentos realizados: %d\nFrases acertadas: %d\nFrases fallidas: %d",auxCli.
puntuacionPartida,auxCli.
puntuacionTotal,auxCli.
numIntentos,auxCli.
frasesAcertadas,auxCli.
frasesFalladas); auxCli.puntuacionPartida=0;
if(send(socketEntrada,bufferAux,200,0)==-1)
perror("\nError al enviar estadisticas\n");
//reiniciamos la informacion del jugador
auxCli.jugando=0;
auxCli.modoJuego=-1;
auxCli.puntuacionPartida=0;
strcpy(auxCli.
frasePartida,""); auxCli.numIntentos=0;
auxCli.numeroRefran=-1;
}
}
} //fin opcion RESOLVER
if(strcmp(kword
,"PARTIDA-INDIVIDUAL")==0) {
auxCli=buscaCliente(socketEntrada);
if(auxCli.loggeado==1 && auxCli.registrado==1 && auxCli.autenticado==1)
{
if(auxCli.jugando==0)
{
auxCli.jugando=1;
auxCli.modoJuego=0;
auxCli.
numeroRefran=rand()%numRefranes
;
j=0;
for(i
=0;i
<strlen(refranes
[auxCli.
numeroRefran]);i
++) {
switch(refranes[auxCli.numeroRefran][i])
{
case ',':
buffer[i]=',';
break;
case ' ':
buffer[i]=' ';
break;
case '.':
buffer[i]='.';
default:
buffer[i]='-';
break;
}
}
buffer[i]='\0';
strcpy(auxCli.
frasePartida,buffer
);
if (send(socketEntrada, buffer, 200, 0) == -1)
perror("\nError envio refran oculto\n"); }
else
{
strcpy(buffer
, "-Err. Ya tiene una partida en curso"); if(send(socketEntrada, buffer, 200, 0) == -1)
}
}
else
{
strcpy(buffer
, "-Err. Debe iniciar sesion antes de empezar"); if(send(socketEntrada, buffer, 200, 0) == -1)
perror("\nError en el envio fallo partida nueva\n");; }
} //fin opcion PARTIDA-INDIVIDUAL
if(strcmp(kword
,"PARTIDA-GRUPO")==0) {
//CODIGO PARA PARTIDA COLECTIVA
}
{
strcpy(buffer
,"¡Hasta otra!"); if(send(socketEntrada,buffer,200,0)==-1)
perror("\nError en el envio de mensaje salida\n"); close(socketEntrada);
FD_CLR(socketEntrada,&sockAux);
auxCli=buscaCliente(socketEntrada);
if(auxCli.registrado==1)
{
auxCli.numSocket=0;
auxCli.jugando=0;
auxCli.loggeado=0;
auxCli.autenticado=0;
auxCli.modoJuego=-1;
strcpy(auxCli.
frasePartida,""); auxCli.numeroRefran=-1;
auxCli.frasesFalladas=0;
auxCli.frasesAcertadas=0;
auxCli.puntuacionPartida=0;
auxCli.numIntentos=0;
}
numClientesIn--;
} //fin opcion SALIR
}//fin else de recepcion de mensaje
sockIn=sockAux;//FD_COPY(&sockAux,&sockIn);
}//fin if de existencia de socketEntrada
else //si no esta en el conjunto de sockets
{
if((newSocket=accept(socketDes,(struct sockaddr*)&from, &from_len))==-1)
{
printf("\nError aceptando peticion de conexion\n"); }
else
numClientesIn++;
if(numClientesIn>50)
{
strcpy(buffer
,"\n-Err. No se aceptan mas conexiones\n"); if(send(newSocket,buffer,200,0)==-1)
perror("\nError envio negacion conexion\n"); close(newSocket);
}
else
{
printf("\n+Ok. Aceptada una nueva conexion, usuario nº %d",numClientesIn
);
auxCli.numSocket=newSocket;
auxCli.jugando=0;
auxCli.registrado=0;
auxCli.loggeado=0;
auxCli.autenticado=0;
auxCli.modoJuego=-1;
auxCli.puntuacionPartida=0;
auxCli.puntuacionTotal=0;
strcpy(auxCli.
frasePartida,""); auxCli.numIntentos=0;
auxCli.numeroRefran=-1;
auxCli.frasesAcertadas=0;
auxCli.frasesFalladas=0;
introduceCliente(auxCli);
}
sockIn=sockAux;//FD_COPY(&sockAux,&sockIn);
if(numClientesIn<50)
FD_SET(newSocket,&sockIn);
sockAux=sockIn;//FD_COPY(&sockIn,&sockAux);
}
}
}
return 0;
}
void quitHandler (int sig)
{
close(socketDes);
printf("\nServidor terminado\n"); }