void handler_seniales(int s) { desconectar(); liberar_recursos(); kill(getpid(), SIGKILL); }
void processo_t::check() { int recurso; int sucesso; liberar_recursos(); recurso = use_recurso(); sucesso = bloquear_recurso(recurso); if(sucesso) { recurso_bloqueado = recurso; } time_proc -= QUANTUM; }
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; }
int mostrar_lista() { int s, r; char buffer[MAXBUF]; bzero(buffer, MAXBUF); // Pido la lista de jugadores struct MensajeNIPC mensajeLista; mensajeLista.tipo = Lista_Jugadores; s = send(sockfd, &mensajeLista, sizeof(struct MensajeNIPC), 0); if (s == -1) { perror("Error al enviar el mensaje.\n"); return -1; } // Recibo lista de jugadores r = recv(sockfd, buffer, sizeof(struct MensajeNIPC), 0); TIPO_MENSAJE tipo; memcpy(&tipo, buffer, sizeof(TIPO_MENSAJE)); int payloadLength; memcpy(&payloadLength, buffer + sizeof(TIPO_MENSAJE), sizeof(int)); // Valido que la lista no este vacia, si esta vacia lo pongo a esperar // Si la lista esta vacia el fd del primer jugador va a ser 0 if (payloadLength == 0) { printf("No hay jugadores disponibles en este momento.\n"); esperarPartida(); } else { int i = 0; char messageBuffer[MAXBUF]; memcpy(jugadoresDisponibles, buffer + sizeof(TIPO_MENSAJE) + sizeof(int), payloadLength); strcat(messageBuffer, "Lista de jugadores disponibles:\n\n"); while (jugadoresDisponibles[i].clientfd != 0) { char num[5]; sprintf(num, "%d", i + 1); strcat(messageBuffer, num); strcat(messageBuffer, ". "); strcat(messageBuffer, jugadoresDisponibles[i].nombre); strcat(messageBuffer, "("); strcat(messageBuffer, jugadoresDisponibles[i].ip); strcat(messageBuffer, ")\n"); i++; } jugadoresDisponiblesCont = i; printf("%s\n", messageBuffer); if (elegirJugador() == -1) { perror("Error al elegir jugador.\n"); liberar_recursos(); return -1; } } return 0; }