/* ** Universidade do Estado do Rio de Janeiro ** Faculdade de Enganharia ** Departamento de Sistemas e Computacao ** Autora: Elaine de Mattos Silva ** Projeto de Graduacao - Adequacao do Software ** de Simulacao Scicos para Aquisicao de dados ** e o Controle em Tempo Real ** ------------------------------------------------------------------------------------------- ** Modulo cliente de funcoes de aquisicao da API do projeto COMEDI ** Versao: ** 0.1 - 10/06/2009 - terminada primeira versao (teste de conexao apenas). ** 0.2 - 28/06/2009 - inserida logica de envio e recepcao de dados ** ------------------------------------------------------------------------------------------- ** cliente.c -- requisita sequencias de aquisicao de dados ao servidor de aquisicao */ #include #include #include #include #include #include #include #include #include #include #define PORTA "3490" #define BUFFERSIZE 1024 //tamanho maximo de bytes adquiridos de uma vez //define se IPv4 ou IPv6 void *get_in_addr(struct sockaddr *sa); int main(int argc, char *argv[]){ int sockfd, numbytes; struct addrinfo hints,*servinfo, *p; //aponta para lista de resultados int status; struct sockaddr_storage client_addr; char s[INET6_ADDRSTRLEN]; socklen_t sin_size; if (argc < 3){ fprintf(stderr,"usage: cliente IP comando\n"); exit(1); } memset(&hints, 0, sizeof hints); // zera estrutura addrinfo hints.ai_family = AF_UNSPEC; // nao importa se eh IPv4 ou 6 hints.ai_socktype = SOCK_STREAM; //escolhe TCP/IP //faz servinfo apontar para uma lista encadeada de 1 ou mais addrinfos. if ((status = getaddrinfo(argv[1],PORTA,&hints,&servinfo)) != 0){ fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); return 1; } //percorre lista e conecta com o primeiro resultado valido for(p = servinfo; p != NULL; p = p->ai_next){ if((sockfd = socket(p->ai_family,p->ai_socktype,p->ai_protocol)) == -1){ perror("cliente: socket\n"); continue; } if(connect(sockfd,p->ai_addr,p->ai_addrlen) == -1){ close(sockfd); perror("cliente: connect\n"); continue; } break; } if(p == NULL){ fprintf(stderr, "cliente: nao foi possivel conectar ao servidor\n"); return 2; } inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),s,sizeof s); printf("cliente: conectado a %s\n",s); freeaddrinfo(servinfo); //recebe dados do terminal e preenche buffer char *htmlSendHeader = "GET /"; char *sendBuffer = malloc(sizeof(char) * BUFFERSIZE); bzero(sendBuffer, sizeof sendBuffer); strcpy(sendBuffer,htmlSendHeader); //copia a string do prot. html para o buffer de envio int sentBytes, argnum; for (argnum = 2; argc > argnum; argnum++){ strcat(sendBuffer,argv[argnum]); //concatena o primeiro argumento da linha de comando e o sendBuffer strcat(sendBuffer, "/"); //printf("Argumentos concatenados: %s\n",sendBuffer); } strcat(sendBuffer," HTTP/1.1"); printf("Argumentos a ser enviados para servidor: %s\n",sendBuffer); //envia dados para o servidor sentBytes = write(sockfd,sendBuffer,strlen(sendBuffer)); printf("Enviados %d bytes\n",sentBytes); if(sentBytes < 0){ perror("cliente: write"); close(sockfd); } //recebe dados do servidor int bytesRead = 0; int numBytes = 0; char buff[BUFFERSIZE]; bzero(buff, sizeof buff); numBytes = read(sockfd, buff, BUFFERSIZE -1); if(numbytes == -1){ perror("read"); close(sockfd); }else{ printf("%s\n",buff); } close(sockfd); } void *get_in_addr(struct sockaddr *sa){ if (sa->sa_family == AF_INET){ return &(((struct sockaddr_in*) sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); }