cnos-assignment-2/client1.c
Thomas Wade 01c2f20894 Reformat to my own standard
No GNU, no GNOME, no Linux Kernel.
2018-11-01 08:42:38 +10:30

140 lines
2.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#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 <ip_serv> <port_serv> <filename>\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("Bytes transferred: %lld\n", count);
printf("Total size: %lld \n", sz);
printf("Total duration: %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;
}