#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 

#define SIZE32KB 320*1024

int main(int argc, char *argv[])
{
    int sockfd = 0;
    char recvBuff[65536];
    struct sockaddr_in serv_addr; 
    uint32_t n = 0;
    char cmp[3] = "ACK";
    struct timeval start, stop;

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    } 

    memset(recvBuff, '0',sizeof(recvBuff));
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5005); 
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);


    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
       printf("\n Error : Connect Failed \n");
       return 1;
    } 
    n = 0;    
    gettimeofday(&start, 0);
    while(n < SIZE32KB){
        n += recv(sockfd, recvBuff, 65536, 0);
    }
    gettimeofday(&stop, 0);
    printf("DATA RECEIVED IS %d Bytes\n", n);
    printf("Time to receive data is %ldus \n", stop.tv_usec-start.tv_usec);
    n = 0;
    for(int i = 0; i<65536; i++) recvBuff[i] = 57;

    gettimeofday(&start, 0);
    while(n < SIZE32KB){
        n += send(sockfd, recvBuff, 65536, 0);
    }
    gettimeofday(&stop, 0);
    printf("DATA SENT IS %d Bytes\n", n);
    printf("Time to send data is %ldus \n", stop.tv_usec-start.tv_usec);
    
    n = recv(sockfd, recvBuff, 65536,0);
    recvBuff[n]=0;
    if(strcmp(cmp, recvBuff)) {
        printf("EVERYTHING SUCCESSFULL!!!\n");
    }

    if(n < 0)
    {
        printf("\n Read error \n");
    } 

    return 0;
};