// client1 - client program for demonstrating data transfer over TCP/IP // This program complies with the GNU Coding Standards found here: // https://www.gnu.org/prep/standards/html_node/index.html #include #include #include #include #include #include #include #include #include #include #include #define BUFFERT 512 int duration (struct timeval *start, struct timeval *stop, struct timeval *delta); int create_client_socket (int port, char* ipaddr); struct sockaddr_in sock_serv; int main (int argc, char**argv) { struct timeval start, stop, delta; int sfd, fd; char buf[BUFFERT]; off_t count = 0, m, sz; long int n; int l = sizeof(struct sockaddr_in); struct stat buffer; if (argc != 4) { printf("Error usage : %s \n", argv[0]); return EXIT_FAILURE; } sfd = create_client_socket(atoi(argv[2]), argv[1]); if ((fd = open(argv[3], O_RDONLY)) == -1) { perror("open fail"); return EXIT_FAILURE; } if (stat(argv[3], &buffer) == -1) { perror("stat fail"); return EXIT_FAILURE; } else { sz = buffer.st_size; } bzero(&buf, BUFFERT); if(connect(sfd, (struct sockaddr*) &sock_serv, l) == -1) { perror("conexion error\n"); exit (3); } gettimeofday(&start, NULL); n = read(fd, buf, BUFFERT); while(n) { if(n == -1) { perror("read fails"); return EXIT_FAILURE; } m = sendto(sfd, buf, n, 0, (struct sockaddr*) &sock_serv, l); if(m == -1) { perror("send error"); return EXIT_FAILURE; } count += m; bzero(buf,BUFFERT); n = read(fd,buf,BUFFERT); } m = sendto(sfd, buf, 0, 0, (struct sockaddr*) &sock_serv, l); gettimeofday(&stop, NULL); duration(&start, &stop, &delta); printf("Nombre d'octets transférés : %lld\n", count); printf("Sur une taille total de : %lld \n", sz); printf("Pour une durée total de : %ld.%d \n", delta.tv_sec, delta.tv_usec); close(sfd); return EXIT_SUCCESS; } int duration (struct timeval *start, struct timeval *stop, struct timeval *delta) { suseconds_t microstart, microstop, microdelta; microstart = (suseconds_t) (100000 * (start->tv_sec)) + start->tv_usec; microstop = (suseconds_t) (100000 * (stop->tv_sec)) + stop->tv_usec; microdelta = microstop - microstart; delta->tv_usec = microdelta % 100000; delta->tv_sec = (time_t) (microdelta / 100000); if ((*delta).tv_sec < 0 || (*delta).tv_usec < 0) { return -1; } else { return 0; } } int create_client_socket (int port, char* ipaddr) { int l; int sfd; sfd = socket(PF_INET, SOCK_STREAM, 0); if (sfd == -1) { perror("socket fail"); return EXIT_FAILURE; } l = sizeof(struct sockaddr_in); bzero(&sock_serv, l); sock_serv.sin_family=AF_INET; sock_serv.sin_port=htons(port); if (inet_pton(AF_INET, ipaddr, &sock_serv.sin_addr) == 0){ printf("Invalid IP adress\n"); return EXIT_FAILURE; } return sfd; }