void sender(int queue_id) { int count; struct timeval send_time; msgbuf_t message_buffer; data_t *data_ptr = (data_t *)(message_buffer.mtext); fprintf(stderr, "#%d# Sender - Inicialized...\n", getpid()); for (count = 0; count < NO_OF_ITERATIONS; count++) { gettimeofday(&send_time,NULL); message_buffer.mtype = MESSAGE_MTYPE; data_ptr->msg_no = count; data_ptr->send_time = send_time; send_queue_message(&queue_id, &message_buffer); usleep(SENDER_DELAY_TIME); } exit(EXIT_SUCCESS); }
void communication_app(int my_queue, int *queue_list, void *data) { char cpf_list[MAXIMUM_THREADS][SIZE_CPF]; int connected_clients[MAXIMUM_THREADS]; size_t client_count = 0; size_t i; message_t info, request; do { debug(stderr, "Número de dispositivos conectados: %zu\n", client_count); debug(stderr, "Esperando uma mensagem do estabelecimento ou dispositivos...\n"); receive_queue_message(my_queue, &info); if(info.type == MESSAGE_PAYMENT) { debug(stderr, "Recebido mensagem do estabelecimento!\n"); debug(stderr, "Recebido CPF: %s Valor a ser cobrado: %lu\n", info.payment.cpf, info.payment.value_cents); debug(stderr, "Pesquisando CPF na lista de clientes conectados...\n"); for (i = 0; i < client_count; i++) { debug(stderr, "CPF: %s Cliente conectado no socket: %d\n", cpf_list[i], connected_clients[i]); if (strcmp(cpf_list[i], info.payment.cpf) == 0) { debug(stderr, "Cliente encontrado - CPF: %s\n", info.payment.cpf); request.type = MESSAGE_FORWARD_PAYMENT; request.forward_payment.value_cents = info.payment.value_cents; send_queue_message(connected_clients[i], &request); } } } else if (info.type == MESSAGE_DEVICE) { debug(stderr, "Recebido mensagem do celular!\n"); debug(stderr, "Novo CPF conectado no servidor: %s\n", info.connected_client.cpf); if (client_count == MAXIMUM_THREADS) { debug(stderr, "Número de threads excedeu o limite. Acabou memória!\n"); debug(log_error, "Número de threads excedeu o limite. Acabou memória!\n"); exit(EXIT_FAILURE); } strcpy(cpf_list[client_count], info.connected_client.cpf); connected_clients[client_count] = info.connected_client.device_queue; client_count++; } } while(true); }
void tsender<STREAM>::send_message(tmessage message) { LOG_T(__PRETTY_FUNCTION__ , ": id »", message.id() , "« message »", message.contents() , "«.\n"); const bool sending = !messages_.empty(); messages_.push_back(std::move(message)); if(!sending) { send_queue_message(); } }
void tsender<STREAM>::send_queue_message_handler( const boost::system::error_code& error , const size_t bytes_transferred) { LOG_T(__PRETTY_FUNCTION__ , ": error »", error.message() , "« bytes_transferred »", bytes_transferred , "«.\n"); total_bytes_transferred_ += bytes_transferred; if(send_handler_) { send_handler_(error, bytes_transferred, messages_.front()); } messages_.pop_front(); if(!messages_.empty()) { send_queue_message(); } }
void read_command(pid_t child_pid) { char c; while ((c = getchar())) { if (c == '\n') { kill(child_pid, SIGSTOP); switch(get_command()) { case TRAIN_COMMAND: { clear_terminal(); game_status_t status; if (get_status(&status) == -1) { break; } int resources = status.resources; printf("-- TRAINING --\n"); printf("You have [%d] resources\n", resources); printf("What units do you want to train: 'light', 'heavy', 'cavalry', 'worker'\n"); army_type_t army_type = get_army_type(get_command_string()); while (army_type == 0) { printf("Wrong type passed. Try again\n"); army_type = get_army_type(get_command_string()); } int cost = unit_cost(army_type); int max = resources / cost; if (max == 0) { printf("You don't have enough resouces\n"); sleep(1); break; } printf("You can train max [%d]\nHow many do you want?\n", max); int count = atoi(get_command_string()); while (count > max || count < 0) { printf("Wrong number passed\n"); count = atoi(get_command_string()); } server_message_t msg = { 1, { UNIT_TRAINING, { .training = { cid, army_type, count }} }}; send_queue_message(&msg); printf("Started training for [%d] units\n", count); sleep(1); break; } case ATTACK_COMMAND: { clear_terminal(); game_status_t status; if (get_status(&status) == -1) { break; } printf("-- ATTACK --\n"); int light = attack_unit_count(LIGHT, status.army.light); int heavy = attack_unit_count(HEAVY, status.army.heavy); int cavalry = attack_unit_count(CAVALRY, status.army.cavalry); if (light == 0 && heavy == 0 && cavalry == 0) { printf("No army sent.\n"); sleep(1); break; } army_t attack_army = { light, heavy, cavalry, 0 }; server_message_t msg = { 1, { ATTACK, { .attack = { cid, attack_army }} }}; send_queue_message(&msg); sleep(1); break; } default: { break; } }