/* Programa de demonstração de uso de sockets UDP em C no Linux * Funcionamento: * O programa cliente envia uma msg para o servidor. Essa msg é uma palavra. * O servidor envia outra palavra como resposta. */ #include #include #include #include #include #include #include #include #include #define FALHA 1 #define TAM_MEU_BUFFER 1000 int cria_socket_local(void) { int socket_local; /* Socket usado na comunicacão */ socket_local = socket( PF_INET, SOCK_DGRAM, 0); if (socket_local < 0) { perror("socket"); return; } return socket_local; } struct sockaddr_in cria_endereco_destino(char *destino, int porta_destino) { struct sockaddr_in servidor; /* Endereço do servidor incluindo ip e porta */ struct hostent *dest_internet; /* Endereço destino em formato próprio */ struct in_addr dest_ip; /* Endereço destino em formato ip numérico */ if (inet_aton ( destino, &dest_ip )) dest_internet = gethostbyaddr((char *)&dest_ip, sizeof(dest_ip), AF_INET); else dest_internet = gethostbyname(destino); if (dest_internet == NULL) { fprintf(stderr,"Endereço de rede inválido\n"); exit(FALHA); } memset((char *) &servidor, 0, sizeof(servidor)); memcpy(&servidor.sin_addr, dest_internet->h_addr_list[0], sizeof(servidor.sin_addr)); servidor.sin_family = AF_INET; servidor.sin_port = htons(porta_destino); return servidor; } void envia_mensagem(int socket_local, struct sockaddr_in endereco_destino, char *mensagem) { /* Envia msg ao servidor */ if (sendto(socket_local, mensagem, strlen(mensagem)+1, 0, (struct sockaddr *) &endereco_destino, sizeof(endereco_destino)) < 0 ) { perror("sendto"); return; } } int recebe_mensagem(int socket_local, char *buffer, int TAM_BUFFER) { int bytes_recebidos; /* Número de bytes recebidos */ /* Espera pela msg de resposta do servidor */ bytes_recebidos = recvfrom(socket_local, buffer, TAM_BUFFER, 0, NULL, 0); if (bytes_recebidos < 0) { perror("recvfrom"); } return bytes_recebidos; } int main(int argc, char *argv[]) { if (argc < 4) { fprintf(stderr,"Uso: udpcliente endereço porta palavra \n"); fprintf(stderr,"onde o endereço é o endereço do servidor \n"); fprintf(stderr,"porta é o número da porta do servidor \n"); fprintf(stderr,"palavra é a palavra que será enviada ao servidor \n"); fprintf(stderr,"exemplo de uso:\n"); fprintf(stderr," udpcliente baker.das.ufsc.br 1234 \"ola\"\n"); exit(FALHA); } int porta_destino = atoi( argv[2]); int socket_local = cria_socket_local(); struct sockaddr_in endereco_destino = cria_endereco_destino(argv[1], porta_destino); int i = 0; char msg_enviada[1000]; char msg_recebida[1000]; int nrec; do{ printf("tentativa %d\n", i); sprintf(msg_enviada, "tentativa %d ", i); strcat(msg_enviada, argv[3]); envia_mensagem(socket_local, endereco_destino, msg_enviada); nrec = recebe_mensagem(socket_local, msg_recebida, 1000); printf("Mensagem de resposta com %d bytes >>>%s\n", nrec, msg_recebida); sleep(1); ++i; } while( i < 5000 ); }