#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAXHOSTNAME 80 #define BUFSIZE 24 int sd; FILE *excel; typedef enum { ACCELEROMETER, DISTANCE } sensor_type; typedef struct { sensor_type type; int packet_number; char data[4]; } data_packet; static void sig_handler(int signo) { if (signo == SIGINT) { printf("Finalizando programa...\n"); // if ((write(sd, "a", 2)) != -1) // close(sd); fclose(excel); shutdown(sd,2); //close(sd); exit(-1); } return; } int main(int argc, char *argv[]) { int imprimir = 0; pid_t pid; int pfd[2]; int i, status; FILE *pipe1; data_packet in_packet; char buf[BUFSIZE]; struct sockaddr_in server; struct hostent *hp; struct sockaddr_in from; struct sockaddr_in addr; unsigned int fromlen; unsigned int length; int rc, cc; char ThisHost[80]; if ((argc != 3)&&(argc != 4)) { printf("\n\tUsage: %s [p]\n\n", argv[0]); exit(-1); } /* * Captura la senal de SIGINT. */ if (signal(SIGINT, sig_handler) == SIG_ERR) abort(); if (argc == 4) if (argv[3][0] == 'p') imprimir = 1; if (imprimir) { /* * Creacion de las dos pipas (envio y recepcion). */ if (pipe(pfd) < 0) { perror("pipe"); exit(1); } /* * Crear proceso hijo. */ if ((pid = fork()) < 0) { perror("fork"); exit(1); } /* * El proceso hijo ejecuta octave. */ if (pid == 0) { int junk; /* * Enlazamos la entrada estandar con input de pipe. */ dup2(pfd[0], 0); close(pfd[1]); /* cerramos output de pipe */ junk = open("/dev/null", O_WRONLY); dup2(junk, 1); /* Descartamos cualquier mensaje de salida de octave */ dup2(junk, 2); /* Descartamos cualquier mensaje de error de octave */ execlp("octave", "octave", "-i", (char *) 0); perror("exec"); exit(-1); } /* * Cerramos el input de pipe */ close(pfd[0]); pipe1 = fdopen(pfd[1], "w"); fprintf(pipe1, "x = [];\n"); fprintf(pipe1, "y = [];\n"); fflush(pipe1); } excel = fopen("data.xls", "w"); gethostname(ThisHost, MAXHOSTNAME); printf("----TCP/Client running at host NAME: %s\n", ThisHost); if ((hp = gethostbyname(ThisHost)) == NULL) { fprintf(stderr, "Can't find host %s\n", ThisHost); exit(-1); } bcopy(hp->h_addr, &(server.sin_addr), hp->h_length); printf(" (TCP/Client INET ADDRESS is: %s )\n", inet_ntoa(server.sin_addr)); if ((hp = gethostbyname(argv[1])) == NULL) { addr.sin_addr.s_addr = inet_addr(argv[1]); if ((hp = gethostbyaddr((void *)&addr.sin_addr.s_addr, sizeof(addr.sin_addr.s_addr), AF_INET)) == NULL) { fprintf(stderr, "Can't find host %s\n", argv[1]); exit(-1); } } printf("----TCP/Server running at host NAME: %s\n", hp->h_name); bcopy ( hp->h_addr, &(server.sin_addr), hp->h_length); printf(" (TCP/Server INET ADDRESS is: %s )\n", inet_ntoa(server.sin_addr)); server.sin_family = hp->h_addrtype; server.sin_port = htons(atoi(argv[2])); sd = socket (hp->h_addrtype, SOCK_STREAM,0); if (sd<0) { perror("opening stream socket"); exit(-1); } if (connect(sd, (struct sockaddr *)&server, sizeof(server)) < 0) { close(sd); perror("connecting stream socket"); exit(0); } fromlen = sizeof(from); if (getpeername(sd, (struct sockaddr *)&from, &fromlen)<0) { perror("could't get peername\n"); exit(1); } printf("Connected to TCP/Server:"); printf("%s:%d\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); if (imprimir) fprintf(pipe1, "figure(1)\n"); for(;;) { if ((rc = read(sd, buf, sizeof(buf))) < 0) perror("receiving stream message"); if (rc > 0){ for (i = 0; i < rc/sizeof(data_packet); i++) { //printf("i = %i\n", i); memcpy(&in_packet, &buf[i*sizeof(data_packet)], sizeof(data_packet)); //printf("Type: %i\n", (int) in_packet.type); printf("rc: %i, i: %i, Packet Number: %i\n", rc, i, in_packet.packet_number); //printf("Data: %02X %02X %02X %02X\n", in_packet.data[0], // in_packet.data[1], in_packet.data[2], in_packet.data[3]); int temp; memcpy(&temp, in_packet.data, 4); if (imprimir) { fprintf(pipe1, "x = [x %i];\n", in_packet.packet_number); fprintf(pipe1, "y = [y %i];\n", temp); fprintf(pipe1, "plot(x,y)\n"); fflush(pipe1); } fprintf(excel, "%i\t%i\n", in_packet.packet_number, temp); } /* buf[rc]='\0'; printf("Received: \"%s\"\n", buf); if (send(sd, buf, rc, 0) < 0 ) perror("sending stream message"); */ } else { printf("Disconnected..\n"); close(sd); if (imprimir) { fprintf(pipe1, "\n exit\n"); fflush(pipe1); waitpid(pid, &status, 0); fclose(pipe1); } fclose(excel); exit(0); } } }