[FUG-BR] Fwd: "Clonar" conexão
Renato Frederick
renato em frederick.eti.br
Seg Jun 19 17:28:40 BRT 2017
Otacílio, muitíssimo obrigado, acabei de fechar vários ajustes em produção,
dei um passeio para confirmar os recursos que ativei e tudo deu certo.
Agora a noite irei baixar seu software compilar e repetir o passeio com a
moto(melhor parte!) e tudo deve funcionar no espião como no master.
Acredito que o IP que registrará nele será da máquina de produção, mas isto
não tem problema, o registro fica todo com base no IMEI do chip + ID GPS.
Retorno para você aqui em breve. Parabéns pela facilidade em escrever
código, eu nem um hello word sei, ô vida!! :)
Renato Frederick
Consultor em TI
http://about.me/renatofrederick
Skype: renatofrederick
+55 31 99123 - 3006
+55 31 2523 - 0686
Em 19 de junho de 2017 15:24, Otacílio <otacilio.neto em bsd.com.br> escreveu:
> Em 19/06/2017 09:59, Renato Frederick escreveu:
>
> Em 19 de junho de 2017 09:27, Otacílio <otacilio.neto em bsd.com.br>
> escreveu:
>
>> Em 19/06/2017 07:45, Renato Frederick escreveu:
>>
>>
>>
>>
>> A comunicação é feita por TCP ou UDP?
>>
>> []'s
>>
>> -Otacílio
>>
>
> Olá Otacílio! É TCP.
>
> Explicando melhor: O que acontece é que eu tenho um GPS na moto e ele
> envia atualização para um servidor web que montei(ao invés de usar estes da
> china que não tem muito recurso, ou pagar 20 a 30 reais nos brasileiros).
> Lá mostra meu histórico, define cercas(entrou ou saiu do espaço definido
> manda SMS/email), etc.
>
> Porém no GPS eu envio um comando indicando IP e porta do servidor que ele
> vai usar. não posso usar DNS porque a maioria das telemetria não manda DNS
> direito ou o meu GPS não entende.
>
> E eu sempre estou desenvolvendo e melhorando o software, fazendo isto na
> máquina de casa, que tem IP ADSL dinâmico.
>
> Não quero tirar o GPS de usar o IP de producao e colocar em testes, pois
> às vezes o gps fica meio doido, tem que dar reset, quero mexer nele menos
> possível, até porque quanto menos eu mexer melhor, pois em uma emergência
> eu preciso ter na hora a localização, depois que eu bloquear a moto, já que
> muitos meliantes são tão tranquilos que mesmo bloqueado abrem o banco e
> começam a procurar, então tempo é importante.
>
> Então eu queria colocar no GPS o IP fixo que já tenho a produção, porém em
> outra porta(1234) e daí nesta porta usar o NETCAT que vai jogar a
> string(dados hexadecimais reportando longitude + hora/data) para a produção
> na porta certa(5023) e também lá em casa na mesma porta.
>
> Assim, eu tenho garantia que tudo que ele registrar em um tem que aparecer
> no outro. Se não acontecer é que algo no programa está errado, pode ser
> algo que eu fiz.
> Obrigado!
>
>
> Escrevi este pequeno programa que quebra o seu galho.
>
> Ele conecta no servidor de produção e espera a conexão do GPS e de um
> cliente espião. Tudo o que o GPS enviar ele vai enviar para o servidor de
> produção e para o cliente espião. Tudo o que o servidor ou o cliente enviar
> ele vai encaminhar para o GPS. É muito fácil de usar. Qualquer coisa entre
> em contato.
>
> []'s
> -Otacílio
>
> /**
> * Copyright(C) Otacílio de Araújo Ramos Neto
> * Você pode fazer o que quiser com este software, exceto mudar esta
> licença e/ou dizer que foi você
> * quem escreveu.
> *
> * Este software é distribuído acreditando-se que está correto e é
> totalmente funcional, mas sem
> * nenhuma garantia disso ou de que é adequado a um determinado fim. Use-o
> sob sua conta e risco.
> *
> * Para compilar use: cc -Wall -O2 -pipe -o gpsc gpsc.c -lpthread
> */
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <string.h>
> #include <pthread.h>
> #include <signal.h>
> #include <getopt.h> /* getopt_long() */
>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <netdb.h>
>
> #define BUFFER_SIZE 4*1024
> #define BACKLOG 4
>
> const char short_options[] = "s:p:l:c:";
>
> const struct option
> long_options[] = {
> { "server", required_argument, NULL, 's' },
> { "port", required_argument, NULL, 'p' },
> { "ouca", required_argument, NULL, 'l' },
> { "client", required_argument, NULL, 'c' },
> { 0, 0, 0, 0 }
> };
>
> void help(char *nome);
> int conectaServidorProducao(char *server, char *porta);
> void *servidorProducao(void *p);
> void *servidorCliente(void *p);
> void *servidorGPS(void *p);
> void sigpipe(int i);
>
> char server[1024]="\0";
> char porta[6]="\0";
> char ouca[6]="\0";
> char client[6]="\0";
> int producaoSocket=-1;
> int gpsSocket=-1;
> int clienteSocket=-1;
>
> int main(int argc, char **argv){
> pthread_t produServer, clienteServer, gpsServer;
> for (;;) {
> int idx;
> int c;
>
> c = getopt_long(argc, argv, short_options, long_options, &idx);
>
> if (-1 == c)
> break;
>
> switch (c) {
> case 0: // getopt_long() flag
> break;
> case 's':
> strncpy(server, optarg, sizeof(server));
> server[sizeof(server)-1] = '\0';
> break;
> case 'p':
> strncpy(porta, optarg, sizeof(porta));
> porta[sizeof(porta)-1] = '\0';
> break;
> case 'l':
> strncpy(ouca, optarg, sizeof(ouca));
> ouca[sizeof(ouca)-1] = '\0';
> break;
> case 'c':
> strncpy(client, optarg, sizeof(client));
> client[sizeof(client)-1] = '\0';
> break;
> default:
> help(argv[0]);
> exit(EXIT_FAILURE);
> }
> }
>
> if(!strlen(server)){
> fprintf(stderr, "Voce precisa informar o endereço do servidor de
> produção\n\n");
> help(argv[0]);
> exit(EXIT_FAILURE);
> }
>
> if(!strlen(porta)){
> fprintf(stderr, "Voce precisa informar a porta do servidor de
> produção\n\n");
> help(argv[0]);
> exit(EXIT_FAILURE);
> }
>
> if(!strlen(ouca)){
> fprintf(stderr, "Voce precisa informar a porta que deve ouvir o
> GPS\n\n");
> help(argv[0]);
> exit(EXIT_FAILURE);
> }
>
> if(!strlen(client)){
> fprintf(stderr, "Voce precisa informar a porta que o cliente vai
> conectar\n\n");
> help(argv[0]);
> exit(EXIT_FAILURE);
> }
>
> signal(SIGPIPE, sigpipe);
>
> // Cria o thread responsável por conectar no servidor de produção
> if (pthread_create(&produServer, NULL, servidorProducao, NULL)) {
> fprintf(stderr,"Erro ao criar o thread para comunicação com o
> servidorde produção.\n");
> exit(EXIT_FAILURE);
> }
> // Cria o thread responsável por ouvir o cliente
> if(pthread_create(&clienteServer, NULL, servidorCliente, NULL)){
> fprintf(stderr, "Erro ao criar o thread para comunicação com o
> cliente espição.\n");
> exit(EXIT_FAILURE);
> }
> // Cria o thread responsável por ouvir o GPS
> if(pthread_create(&gpsServer, NULL, servidorGPS, NULL)){
> fprintf(stderr, "Erro ao criar o thread para comunicação com o
> cliente GPS.\n");
> exit(EXIT_FAILURE);
> }
>
> pthread_join(produServer, NULL);
> pthread_join(clienteServer, NULL);
> pthread_join(gpsServer, NULL);
>
> printf("DEBUG\n");
> return 0;
> }
>
> void help(char *nome)
> {
> fprintf(stderr, "Voce deve usar: %s <options>\n"
> "-s | --server nome de host Nome de host do servidor de
> produção\n"
> "-p | --port porta no servidor Porta do servidor de produção\n"
> "-l | --ouca porta do GPS Porta em que o GPS vai conectar\n"
> "-c | --client porta do cliente Porta em que o cliente espião vai
> conectar\n", nome);
> }
>
> void sigpipe(int i)
> {
> fprintf(stderr, "broken pipe\n");
> }
>
> int conectaServidorProducao(char *server, char *porta)
> {
> struct addrinfo hints, *result = NULL, *ptr = NULL;
> int iResult;
> int producaoSocket=-1;
>
> bzero(&hints, sizeof(hints));
>
> hints.ai_family = AF_UNSPEC;
> hints.ai_socktype = SOCK_STREAM;
> hints.ai_protocol = IPPROTO_TCP;
>
> // Resolve the server address and port
> iResult = getaddrinfo(server, porta, &hints, &result);
> if ( iResult != 0 ) {
> printf("getaddrinfo failed with error: %d\n", iResult);
> exit(EXIT_FAILURE);
> }
>
> // Attempt to connect to an address until one succeeds
> for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
>
> // Create a SOCKET for connecting to server
> producaoSocket = socket(ptr->ai_family, ptr->ai_socktype,
> ptr->ai_protocol);
> if (producaoSocket < 0){
> perror("socket");
> exit(EXIT_FAILURE);
> }
>
> // Connect to server.
> iResult = connect( producaoSocket, ptr->ai_addr,
> (int)ptr->ai_addrlen);
> if (iResult == -1) {
> close(producaoSocket);
> producaoSocket = -1;
> continue;
> }
>
> break;
> }
>
> freeaddrinfo(result);
>
> if (producaoSocket == -1) {
> printf("Unable to connect to server %s:%s!\n", server, porta);
> }
>
> return producaoSocket;
> }
>
>
> int preparaConexao(uint16_t porta)
> {
> int s;
> int optval;
> struct sockaddr_in sa;
>
> if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
> perror("Nao foi possivel criar o socket servidor");
> exit(EXIT_FAILURE);
> }
>
> bzero(&sa, sizeof(sa));
>
> sa.sin_family = AF_INET;
> sa.sin_port = htons(porta);
>
> if (INADDR_ANY)
> sa.sin_addr.s_addr = htonl(INADDR_ANY);
>
> // Configura o socket para reutilizar um endereço
> optval = 1;
> setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
>
> if (bind(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
> perror("Erro ao fazer o bind para o socket do cliente");
> exit(EXIT_FAILURE);
> }
>
> listen(s, BACKLOG);
>
> return s;
> }
>
> void *servidorCliente(void *p)
> {
> int socket;
> socklen_t b;
> struct sockaddr_in sa;
> char buffer[BUFFER_SIZE];
> int lgpsSocket=-1;
> ssize_t nbytes;
> uint16_t porta = (int)strtol(client, (char **)NULL, 10);
>
> socket = preparaConexao(porta);
>
> b = sizeof(sa);
>
> for(;;){
> if ((clienteSocket = accept(socket, (struct sockaddr *)&sa, &b)) <
> 0) {
> perror("(servidorClient) Erro na chamada accept");
> exit(EXIT_FAILURE);
> }
>
> printf("(servidorClient) cliente conectado\n");
> if(clienteSocket!=-1){
> do{
> // Vamos esperar alguma coisa do servidor. Se chegar
> escreve no socket do GPS
> nbytes = read(clienteSocket, buffer, sizeof(buffer));
>
> if(lgpsSocket==-1 && gpsSocket!=-1)
> if((lgpsSocket = dup(gpsSocket))==-1){
> perror("(servidorCliente) Erro ao executar lgpsSocket
> = dup(gpsSocket)");
> exit(EXIT_FAILURE);
> }
>
> if(nbytes>0){
> if(lgpsSocket!=-1){
> // Escreve a tralha do lado do GPS
> if(write(lgpsSocket, buffer, nbytes) != nbytes){
> fprintf(stderr, "(servidorClient) Pacote
> perdido, numero de bytes escritos no GPS diferente do lido do cliente\n");
> lgpsSocket = -1;
> }
> }else if(lgpsSocket==-1){
> fprintf(stderr, "(servidorClient) Pacote perdido,
> GPS socket fechado\n");
> }else{
> fprintf(stderr, "(servidorClient) Conexao fechada,
> nbytes = %zd\n", nbytes);
> }
> }else if(nbytes==0){
> fprintf(stderr, "(servidorClient) Socket fechado\n");
> }
> }while(nbytes>0);
> close(clienteSocket);
> }
> sleep(3);
> }
>
> return NULL;
> }
>
> void *servidorGPS(void *p)
> {
> int socket;
> socklen_t b;
> struct sockaddr_in sa;
> char buffer[BUFFER_SIZE];
> int lproducaoSocket=-1;
> int lclienteSocket=-1;
> ssize_t nbytes;
> uint16_t porta = (int)strtol(ouca, (char **)NULL, 10);
>
> socket = preparaConexao(porta);
>
> b = sizeof(sa);
>
> for(;;){
> if ((gpsSocket = accept(socket, (struct sockaddr *)&sa, &b)) < 0) {
> perror("(servidorGPS) Erro na chamada accept");
> exit(EXIT_FAILURE);
> }
> printf("(servidorGPS) GPS conectado\n");
> if(gpsSocket!=-1){
> do{
> // Vamos esperar alguma coisa do servidor. Se chegar
> escreve no socket do GPS
> nbytes = read(gpsSocket, buffer, sizeof(buffer));
>
> if(producaoSocket!=-1 && lproducaoSocket==-1){
> if((lproducaoSocket=dup(producaoSocket))==-1){
> perror("(servidorGPS) Erro ao executar
> lproducaoSocket=dup(producaoSocket)");
> exit(EXIT_FAILURE);
> }
> }
> if(clienteSocket!=-1 && lclienteSocket==-1){
> if((lclienteSocket=dup(clienteSocket))==-1){
> perror("(servidorGPS) Erro ao executar
> lclienteSocket=dup(clienteSocket)");
> exit(EXIT_FAILURE);
> }
> }
>
> if(nbytes>0){
> if(lproducaoSocket!=-1){
> // Escreve a tralha do lado do servidor
> if(lproducaoSocket!=-1 && write(lproducaoSocket,
> buffer, nbytes) != nbytes){
> fprintf(stderr, "(servidorGPS) Pacote perdido,
> numero de bytes escritos no servidor de producao diferente do lido do
> GPS\n");
> lproducaoSocket = -1;
> }
> if(lclienteSocket!=-1 && write(lclienteSocket,
> buffer, nbytes) != nbytes){
> fprintf(stderr, "(servidorGPS) Pacote perdido,
> numero de bytes escritos no cliente diferente do lido do GPS\n");
> lclienteSocket = -1;
> }
> }else if(lproducaoSocket==-1){
> fprintf(stderr, "(servidorGPS) Pacote perdido,
> producao socket fechado\n");
> }else{
> fprintf(stderr, "(servidorGPS) Conexao fechada,
> nbytes = %zd\n", nbytes);
> }
> }else if(nbytes==0){
> fprintf(stderr, "(servidorGPS) Socket do GPS
> fechado\n");
> }
> }while(nbytes>0);
> close(gpsSocket);
> }
> sleep(3);
> }
>
> return NULL;
> }
>
> void *servidorProducao(void *p)
> {
> char buffer[BUFFER_SIZE];
> int lgpsSocket=-1;
> ssize_t nbytes;
> for(;;){
> producaoSocket=conectaServidorProducao(server, porta);
> if(producaoSocket!=-1){
> printf("(servidorProducao) Conectado em %s:%s\n", server,
> porta);
> do{
> // Vamos esperar alguma coisa do servidor. Se chegar
> escreve no socket do GPS
> nbytes = read(producaoSocket, buffer, sizeof(buffer));
> if(lgpsSocket==-1 && gpsSocket!=-1){
> if((lgpsSocket=dup(gpsSocket))==-1){
> perror("(servidorProducao) Erro ao executar
> lgpsSocket=dup(gpsSocket)");
> exit(EXIT_FAILURE);
> }
> }
>
> if(nbytes>0){
> if(lgpsSocket != -1){
> // Escreve a tralha do lado do GPS
> if(write(lgpsSocket, buffer, nbytes) != nbytes){
> fprintf(stderr, "(servidorProducao) Pacote
> perdido, numero de bytes escritos no GPS diferente do lido do servidor de
> producao\n");
> lgpsSocket = -1;
> }
> }else if(lgpsSocket==-1){
> fprintf(stderr, "(servidorProducao) Pacote
> perdido, GPS socket fechado\n");
> }else{
> fprintf(stderr, "(servidorProducao) Conexao
> fechada, nbytes = %zd\n", nbytes);
> }
> }else if(nbytes==0){
> fprintf(stderr, "(servidorProducao) Socket fechado\n");
> }
> }while(nbytes>0);
> close(producaoSocket);
> }
> sleep(3);
> }
>
> // Chega nunca aqui
> return NULL;
> }
>
>
Mais detalhes sobre a lista de discussão freebsd