Example #1
0
void handler_seniales(int s) {

	desconectar();

	liberar_recursos();

	kill(getpid(), SIGKILL);
}
Example #2
0
void terminar ()
{	int i;
        desconectar(fdlisten);
	for(i=bots;i<jugadores;i++)
		desconectar(fdclientes[i]);
	printf("Cierre del servidor!\n");fflush(stdout);
	shmctl (id_mem, IPC_RMID, (struct shmid_ds *)NULL);
	shmctl (id_memd, IPC_RMID, (struct shmid_ds *)NULL);
	shmctl (id_memdx, IPC_RMID, (struct shmid_ds *)NULL);
	shmctl (id_memdy, IPC_RMID, (struct shmid_ds *)NULL);
	printf("Matando procesos hijos...");fflush(stdout);
	for(i=0;i<bots;i++)
	{	kill(botpid[i],SIGKILL) ;
		wait(NULL);	}
	printf("Ok\nTerminando proceso...\n");fflush(stdout);
	raise(9);
}
Tuntorialsqlite::Tuntorialsqlite(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Tuntorialsqlite)
{
    ui->setupUi(this);

    this->setWindowTitle("Tutorial SQLITE");
    habilitar_query(false);
    valoresIniciais();

    connect(ui->btn_conectar, SIGNAL(clicked()), this, SLOT(validarCampos()))
    connect(ui->btn_desconectar,SIGNAL(clicked()), this,SLOT(desconectar()))
    connect(ui->btn_executar, SIGNAL(clicked(),this, SLOT (enviarQuery)))

    txt_query = new QSqlQueryModel;
}
int MainCliente::salir(){
	mapMensajes.clear(); // chequear si se liberan los string
	desconectar();
	return 0;
}
int MainCliente::conectarYEjecutar(){
	//----------------------CONECTAR-BEGIN------------------
#ifdef FAKE_DEBUG_CLIENTE
	VistaJuego::getInstance()->getJugador()->nombreDeUsuario.assign("Cliente-A");
#else
	VistaJuego * visJue = VistaJuego::getInstance();
	VistaInicio * visIni = VistaInicio::getInstance();
	this->ip = visIni->getIP();
	this->port = visIni->getPuerto();
	visJue->getJugador()->nombreDeUsuario.assign(visIni->getUsuario());
#endif
	inicializarConexion();

	if(conectado == true){
		Log::getInstance()->warn(" el cliente ya se encuentra conectado.");
		printf("ya se encuentra conectado \n");
	}
	else{
		//Intentamos establecer la conexión
		int conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
		if (conex==-1) //si no se ha podido conectar porque no se ha encontrado el host o no está el puerto abierto
		{
			Log::getInstance()->error(" no se ha podido conectar.");
			printf("No se ha podido conectar\n");
			printf("%i", conex);
			return -1;
		}
		else{
			// Se envia un mensaje al servidor para que valide el nombre de usuario
			MensajeXml mensajeUsuario;
			mensajeUsuario.setValor((char*)VistaJuego::getInstance()->getJugador()->nombreDeUsuario.c_str(), strlen(VistaJuego::getInstance()->getJugador()->nombreDeUsuario.c_str()));
			mensajeUsuario.setTipo(TIPO_STRING);
			mensajeUsuario.calculateSizeBytes();
			char bufferSalida [MAX_BUFFER];
			int size = Protocolo::codificar(mensajeUsuario, bufferSalida);
			MensajeSeguro::enviar(sock, bufferSalida, size);

			char bufferEntrada[MAX_BUFFER];
			// Se recibe la confirmación de la validación del nombre de usuario
			int len2 = MensajeSeguro::recibir(sock,bufferEntrada);
			if (len2 <= 0){// Es un error
				chequearConexion(len2);
			}
			else{
				//decodificar el mensaje
				MensajeXml mensaXmlRespuestaUsuario;
				int offset = Protocolo::decodificar(bufferEntrada,&mensaXmlRespuestaUsuario);
				char * respuesta = mensaXmlRespuestaUsuario.getValor();
				if (strcmp(respuesta,MSJ_CONEX_ACEPT) == 0){
					char* idUsuario;
					Posicion posicion;
					Posicion posicionMapa;
					// Si el server nos envia respuesta, es que la conexion ha sido satisfactoria
					Log::getInstance()->info("El cliente se ha conectado correctamente.");
					conectado = true;
					MainCliente::serverDesconectado = false;
					MainCliente::cerrarConexion = false;

					// Decodifica cómo se juega
					MensajeXml mensaXmlModoDeJuego;
					offset += Protocolo::decodificar(bufferEntrada + offset,&mensaXmlModoDeJuego);
					char * modoDeJuego = mensaXmlModoDeJuego.getValor();

					if (strcmp(modoDeJuego, MODO_EQUIPO) == 0) {
						// Decodifica si hay equipos libres
						MensajeXml mensaXmlDisponibilidadEquipos;
						offset += Protocolo::decodificar(bufferEntrada + offset,&mensaXmlDisponibilidadEquipos);
						char * disponibilidadEquipos = mensaXmlDisponibilidadEquipos.getValor();

						if (strcmp(disponibilidadEquipos, HAY_DISPONIBILIDAD) == 0) {
							VistaInicio::getInstance()->mostrarSeleccionDeEquipos();
							string equipo = VistaInicio::getInstance()->getEquipo();

							// Envio qué equipo se seleccionó
							MensajeXml mensajeEquipo;
							mensajeEquipo.setValor((char*)equipo.c_str(), strlen(equipo.c_str()));
							mensajeEquipo.setTipo(TIPO_STRING);
							mensajeEquipo.calculateSizeBytes();
							char bufferSalida [MAX_BUFFER];
							int size = Protocolo::codificar(mensajeEquipo, bufferSalida);
							MensajeSeguro::enviar(sock, bufferSalida, size);
						}

						MensajeXml mensaXml;

						offset += Protocolo::decodificar(bufferEntrada + offset,&mensaXml);

						char* idUsuarioXml = mensaXml.getValor();

						idUsuario= new char[strlen(idUsuarioXml) + 1];
						std::copy(idUsuarioXml, idUsuarioXml + strlen(idUsuarioXml), idUsuario);

						// Se decodifica la posicion inicial desde donde arranca el avión
						offset += Protocolo::decodificar(bufferEntrada + offset, &posicion);

						// Se decodifica la posicion del mapa, que tiene solo una componente: Y
						offset += Protocolo::decodificar(bufferEntrada + offset, &posicionMapa);

						//se procede a decodificar el resto del mensaje
						//se decodifica el escenario completo
						offset += Protocolo::decodificar(bufferEntrada + offset,this->servidorXml);
					}
					else {
						// Se juega sin equipos
						MensajeXml mensaXml;
						offset += Protocolo::decodificar(bufferEntrada + offset,&mensaXml);

						char* idUsuarioXml = mensaXml.getValor();
						idUsuario= new char[strlen(idUsuarioXml) + 1];
						std::copy(idUsuarioXml, idUsuarioXml + strlen(idUsuarioXml), idUsuario);

						// Se decodifica la posicion inicial desde donde arranca el avión
						offset += Protocolo::decodificar(bufferEntrada + offset, &posicion);

						// Se decodifica la posicion del mapa, que tiene solo una componente: Y
						offset += Protocolo::decodificar(bufferEntrada + offset, &posicionMapa);

						//se procede a decodificar el resto del mensaje
						//se decodifica el escenario completo
						offset += Protocolo::decodificar(bufferEntrada + offset,this->servidorXml);
					}

					// Se cierra la ventana del menu de inicio
					VistaInicio::getInstance()->close();
					// Creo un hilo para escuchar los mensajes
					receptor=SDL_CreateThread(fun_recibirMensajes, "recibirMensajes", &sock);
	//----------------------CONECTAR-END------------------
					VistaJuego *visJuego = VistaJuego::getInstance();
					visJuego->getJugador()->nombreDeUsuario.assign(VistaInicio::getInstance()->getUsuario());
					visJuego->getJugador()->setIdCliente(atoi(idUsuario));
					visJuego->getJugador()->setPosicionAvion(posicion);

					visJuego->readServidorXml(this->servidorXml);
					visJuego->agregarObservador(this);
	//----------------------EJECUTAR-BEGIN------------------
					visJuego->inicializar();
					visJuego->ejecutar(this->servidorXml, posicionMapa.getPosY());
					// se termina el programa cuando el usuario hace click en x del SDL_window
	//----------------------EJECUTAR-END------------------
					terminarElCliente();
				}
				else if (strcmp(respuesta,MSJ_SUPERO_MAX) == 0){
					// El server envia un mensaje al superar la cantidad de clientes
					Log::getInstance()->error(bufferEntrada);
				#ifndef FAKE_DEBUG_CLIENTE
					VistaInicio::getInstance()->mostrarMensajeInformacion(MSJ_SUPERO_MAX);
				#endif
					shutdown(sock,2);
					closesocket(sock);
					terminarElCliente();
				}
				else if (strcmp(respuesta, MSJ_USR_YA_CONECT) == 0) {
					// El server ya tiene un usuario igual y está conectado
					Log::getInstance()->error(bufferEntrada);
				#ifndef FAKE_DEBUG_CLIENTE
					VistaInicio::getInstance()->mostrarMensajeInformacion(MSJ_USR_YA_CONECT);
				#endif
					desconectar();
					terminarElCliente();
				}
			}
		}
	}
	return 0;
}
Example #6
0
int main(int argc, char * argv[]) {

	int s, r;
	struct sockaddr_in dest;
	char buffer[MAXBUF];
	struct Mensaje mensaje;

	if (argc < 3) {
		puts("Usage ./cliente [nombre] [pos1] ...");
		return EXIT_FAILURE;
	}

	signal(SIGKILL, handler_seniales);
	signal(SIGTERM, handler_seniales);

	cantidad_barcos_hundidos = 0;

	// Validacion de las posiciones de la matriz
	cantidad_barcos = argc - 2; // Le resto los primeros 2 argumentos: ejecutable y nombre de jugador

	//char * posiciones[cantidad_barcos];

	if (validarPosiciones(argv, posiciones_barcos) == -1) {
		return EXIT_FAILURE;
	}

	//posiciones_barcos = posiciones;

	// Leo ip y puerto del servidor del archivo de configuracion
	struct Conexion conexion = leerConfiguracion();

	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("Socket");
		return EXIT_FAILURE;
	}

	/*---Initialize server address/port struct---*/
	bzero(&dest, sizeof(dest));
	dest.sin_family = AF_INET;
	dest.sin_port = htons(conexion.puerto);
	if (inet_aton(conexion.ip, &dest.sin_addr.s_addr) == 0) {
		perror(conexion.ip);
		return EXIT_FAILURE;
	}

	/*---Connect to server---*/
	if (connect(sockfd, &dest, sizeof(dest)) != 0) {
		perror("Connect ");
		return EXIT_FAILURE;
	}

	bzero(buffer, MAXBUF);

	// Enviar nombre jugador
	mensaje.tipo = Registra_Nombre;
	strcpy(mensaje.contenido, argv[1]);

	sleep(2);

	s = send(sockfd, &mensaje, sizeof(mensaje), 0);

	if (s == -1) {
		perror("Error al enviar el nombre del jugador");
		return EXIT_FAILURE;
	}

	// Recibo la estructura del jugador registrado.
	r = recv(sockfd, buffer, sizeof(struct MensajeNIPC), 0);

	memcpy(&jugador, buffer + sizeof(TIPO_MENSAJE) + sizeof(int),
			sizeof(struct Jugador));

	printf("Se ha registrado en el servidor como el jugador %s.\n",
			jugador.nombre);

	if (mostrar_lista() == -1) {
		return EXIT_FAILURE;
	}

	desconectar();

	liberar_recursos();
	return EXIT_SUCCESS;
}
/*
 * PLANIFICADOR
 */
void *planificador(void * pvNivel) {

    // Armo el nivel que planifico con los parametros que recibe el hilo
    tNivel *pNivel;
    pNivel = (tNivel*) pvNivel;

    //Para multiplexar
    int iSocketConexion;
    fd_set readfds;
    FD_ZERO(&readfds);
    tMensaje tipoMensaje = NADA;
    tPersonaje* pPersonajeActual;
    char* sPayload;

    pPersonajeActual = NULL;

    // Ciclo donde se multiplexa para escuchar personajes que se conectan
    while (1) {

    	if(tipoMensaje!=N_MUERTO_POR_ENEMIGO){
    		waitPersonajes(pNivel, &pPersonajeActual);
    	}

        iSocketConexion = multiplexar(&pNivel->masterfds, &readfds, &pNivel->maxSock, &tipoMensaje, &sPayload, logger);

        if (iSocketConexion != -1) {

        	switch (tipoMensaje) {

            /* Mensajes que puede mandar el personaje */
            case(P_POS_RECURSO):
				personajeSolicitaPosicionRecurso(pNivel, pPersonajeActual, iSocketConexion, sPayload, logger);
                break;

            case(P_MOVIMIENTO):
                movimientoPersonaje(iSocketConexion, sPayload, pNivel, &pPersonajeActual);

            	break;

            case(P_SOLICITUD_RECURSO):
                solicitudRecursoPersonaje(iSocketConexion, sPayload, pNivel, &pPersonajeActual);
                break;

//            //Cuando llega al recurso y aún
//            case(P_FIN_TURNO):
//				seleccionarJugador(&pPersonajeActual, pNivel);
//            	break;

            /* Mensajes que puede mandar el nivel */
            case(N_POS_RECURSO):
				entregoPosicionRecursoAlPersonaje(pNivel, pPersonajeActual, iSocketConexion, sPayload, logger);
            	seleccionarJugador(&pPersonajeActual, pNivel);
				break;

            case(N_ACTUALIZACION_CRITERIOS):
                actualizacionCriteriosNivel(iSocketConexion, sPayload, pNivel, pPersonajeActual);
                break;

            case(N_MUERTO_POR_ENEMIGO):
				muertePorEnemigoPersonaje(pNivel, &pPersonajeActual, iSocketConexion, sPayload);
            	break;

            case(N_MUERTO_POR_DEADLOCK):
				muertePorDeadlockPersonaje(pNivel, sPayload);
				break;

            case(N_ENTREGA_RECURSO):
				recepcionRecurso(pNivel, &pPersonajeActual, sPayload);
            	seleccionarJugador(&pPersonajeActual, pNivel);
            	break;

            case(N_BLOQUEADO_RECURSO):
				recepcionBloqueado(pNivel, &pPersonajeActual, sPayload);
            	seleccionarJugador(&pPersonajeActual, pNivel);
            	break;

            case(N_CONFIRMACION_MOV):
				confirmarMovimiento(pNivel, pPersonajeActual);
            	seleccionarJugador(&pPersonajeActual, pNivel);
				break;

            case(DESCONEXION):
				desconectar(pNivel, &pPersonajeActual, iSocketConexion);
            	if(pPersonajeActual == NULL)
            		seleccionarJugador(&pPersonajeActual, pNivel);
				break;

            default:
            	log_error(logger, "Mensaje no esperado");
                break;

            } //Fin de switch

        } //Fin del if

    } //Fin del while

    pthread_exit(NULL);

}