Programación General > C++ Builder
Ahorcado cliente servidor TCP
(1/1)
antlcn:
Hola, estoy trabajando en el juego del ahorcado donde existe un servidor al que pueden conectarse varios clientes y jugar partidas individuales simultaneas gracias a la funcion select(). El caso es que al compilar "servidor.c" todo va bien pero lo ejecuto y me devuelve el siguiente error:
*** glibc detected *** ./servidor: corrupted double-linked list: 0x09310168 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c0c1)[0x17c0c1]
/lib/libc.so.6(+0x6d9f3)[0x17d9f3]
/lib/libc.so.6(cfree+0x6d)[0x180a1d]
/lib/libc.so.6(fclose+0x14a)[0x16c3da]
./servidor[0x8048ad2]
./servidor[0x80492d0]
/lib/libc.so.6(__libc_start_main+0xe7)[0x126ce7]
./servidor[0x8048931]
======= Memory map: ========
00110000-00267000 r-xp 00000000 07:00 21126 /lib/libc-2.12.1.so
00267000-00269000 r--p 00157000 07:00 21126 /lib/libc-2.12.1.so
00269000-0026a000 rw-p 00159000 07:00 21126 /lib/libc-2.12.1.so
0026a000-0026d000 rw-p 00000000 00:00 0
00381000-0039b000 r-xp 00000000 07:00 95 /lib/libgcc_s.so.1
0039b000-0039c000 r--p 00019000 07:00 95 /lib/libgcc_s.so.1
0039c000-0039d000 rw-p 0001a000 07:00 95 /lib/libgcc_s.so.1
003e8000-003e9000 r-xp 00000000 00:00 0 [vdso]
0081c000-00838000 r-xp 00000000 07:00 21110 /lib/ld-2.12.1.so
00838000-00839000 r--p 0001b000 07:00 21110 /lib/ld-2.12.1.so
00839000-0083a000 rw-p 0001c000 07:00 21110 /lib/ld-2.12.1.so
08048000-0804b000 r-xp 00000000 08:05 5213 /"RUTA FICHERO"/
0804b000-0804c000 r--p 00002000 08:05 5213 /"RUTA FICHERO"/
0804c000-0804d000 rw-p 00003000 08:05 5213 /"RUTA FICHERO"/
09310000-09331000 rw-p 00000000 00:00 0 [heap]
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
b77b4000-b77b5000 rw-p 00000000 00:00 0
b77c9000-b77cb000 rw-p 00000000 00:00 0
bfada000-bfafb000 rw-p 00000000 00:00 0 [stack]
Abortado
Aquí dejo mi código:
--- Código: C ---#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"); exit(-1); } /*------------------------------------------------------ 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); exit(-1); } from_len = sizeof(from); if (listen(socketDes,1) == -1) { perror("Error en la operacion de listen"); close (socketDes); exit(-1); } 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"); exit(1); } 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) perror("Error en el envio"); modificarCliente(auxCli); //se incluye la informacion en el fichero } else { strcpy(buffer, "-Err. Error en la validacion"); if(send(socketEntrada, buffer, 200, 0) == -1) perror("Error en el envio"); } }//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 if(strcmp(kword,"VOCAL")==0) { 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; srand(time(NULL)); auxCli.numeroRefran=rand()%numRefranes; strcpy(buffer,""); 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) perror("Error en el envio"); } } 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 } if(strcmp(kword,"SALIR")==0) { 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"); exit(1); } 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; strcpy(auxCli.nombreUser,""); strcpy(auxCli.passUser,""); 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"); exit(0);}
Gracias de antemano.
Un saludo!
Eternal Idol:
Depura tu programa con gdb, primero generalo en version de depuracion asi podras ver cual es la pila cuando se produce el error en cuestion:
http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html
Navegación
Ir a la versión completa