/* Canhão UDP Cliente Alunos: Luis Eduardo Mochenski Floriano GRR 20190354 Thiago Ruiz Aniceto GRR 20190355 Atualizado em: 21/02/2023 */ #include #include #include #include #include #include // Sistema DNS-revis #include #include #include #define TAMANHO_MAXIMO_DADOS 200 #define TAM_MENSAGEM_LOG 9000 void log_mensagem(char *mensagem) { // Registra o tempo usando a lib "time.h" struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); // Adiciona o tempo atual com o formato "Y-M-D H:M:S:ms" char datetime_str[24]; // Salva sem MS strftime(datetime_str, sizeof(datetime_str), "%H:%M:%S", localtime(&spec.tv_sec)); // Adiciona MS ao final da string sprintf(datetime_str + strlen(datetime_str), ".%03ld", spec.tv_nsec / 1000000); // Registra o log printf("[%s]: %s\n", datetime_str, mensagem); } int main(int argc, char *argv[]) { int sockdescr; int numbytesrecv; struct sockaddr_in sa; struct hostent *hp; char buf[BUFSIZ + 1]; char *host; int quantidade_dados; char mensagem_de_log[TAM_MENSAGEM_LOG]; if (argc != 4) { puts("Uso correto: cliente "); exit(1); } host = argv[1]; quantidade_dados = atoi(argv[3]); if ((hp = gethostbyname(host)) == NULL) // Cliente DNS chamado de resolvedor (resolver) { puts("Não foi possível resolver o endereço IP do servidor."); exit(1); } bcopy((char *)hp->h_addr, (char *)&sa.sin_addr, hp->h_length); sa.sin_family = hp->h_addrtype; sa.sin_port = htons(atoi(argv[2])); // faz a conversão de little endian para big endian if ((sockdescr = socket(hp->h_addrtype, SOCK_DGRAM, 0)) < 0) { puts("Erro ao abrir o socket"); exit(1); } if (connect(sockdescr, (struct sockaddr *)&sa, sizeof(sa)) < 0) { puts("Não foi possível conectar ao servidor."); exit(1); } log_mensagem("Abre conexão com socket descr"); snprintf(mensagem_de_log, TAM_MENSAGEM_LOG, "Inicia canhão UDP com %d pacotes", quantidade_dados); log_mensagem(mensagem_de_log); char dados[TAMANHO_MAXIMO_DADOS]; log_mensagem("Envia quantos dados o Servidor deve esperar receber."); snprintf(dados, TAMANHO_MAXIMO_DADOS, "total=%d", quantidade_dados); snprintf(mensagem_de_log, TAM_MENSAGEM_LOG, "Enviando %s", dados); log_mensagem(mensagem_de_log); if (sendto(sockdescr, dados, strlen(dados) + 1, 0, (struct sockaddr *)&sa, sizeof sa) != strlen(dados) + 1) { puts("Não foi possível fazer a transmissão."); exit(1); } memset(dados, 0, strlen(dados)); for (long int i = 1; i <= quantidade_dados; i++) { snprintf(dados, TAMANHO_MAXIMO_DADOS, "%ld", i); snprintf(mensagem_de_log, TAM_MENSAGEM_LOG, "Enviando %s", dados); log_mensagem(mensagem_de_log); if (sendto(sockdescr, dados, strlen(dados) + 1, 0, (struct sockaddr *)&sa, sizeof sa) != strlen(dados) + 1) { puts("Não foi possível fazer a transmissão."); exit(1); } memset(dados, 0, strlen(dados)); } // Envia fim de transmissão (dez vezes) snprintf(dados, TAMANHO_MAXIMO_DADOS, "fim"); snprintf(mensagem_de_log, TAM_MENSAGEM_LOG, "Enviando %s", dados); log_mensagem(mensagem_de_log); for (int i = 0; i < 10; i++) { if (sendto(sockdescr, dados, strlen(dados) + 1, 0, (struct sockaddr *)&sa, sizeof sa) != strlen(dados) + 1) { puts("Não foi possível fazer a transmissão."); exit(1); } } snprintf(mensagem_de_log, TAM_MENSAGEM_LOG, "Fim canhão UDP, %d pacotes enviados", quantidade_dados); close(sockdescr); exit(0); }