/* Simple Server code on TCP/IP protocol */

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <signal.h>
#include <ctype.h>          
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>

#define length 4096
void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno;	//Declare variable for Socket and port
     socklen_t clilen;	//Client address and port no
     char buffer[length];	//Buffer for message

     struct sockaddr_in serv_addr, cli_addr;	//Srtructure for server and Client address
     int n;	//Check whether listen,accept,read,write process done
     FILE *fileptr;	//File pointer
     int datasize;
     struct timeval start,stop;
     double sec =0;

	/* Check Portno. provided or not */
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }

	/*Create socket*/
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");

     bzero((char *) &serv_addr, sizeof(serv_addr));	//Clear memory for Server address 
     portno = atoi(argv[1]);	//Convert portno in to Integer from ASCII

	/*Server address and all other details */
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);

	/*Bind socket*/
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");

	/*Listening to socket and waiting for users(max.5) */
     listen(sockfd,5);

     clilen = sizeof(cli_addr);	//Size of Client address

	/*Accept users*/
     newsockfd= accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);
     if (newsockfd< 0) 
          error("ERROR on accept");
     

	/*File operations */
	char* fs_name = "/home/ankur/Desktop/RTSIM_Dump.csv";	
     fileptr=fopen(fs_name,"r");	//Open file

	/*Write and Read operation to socket*/
	gettimeofday(&start,NULL);
	bzero(buffer,length);
	while((datasize = fread(buffer,sizeof(char),length,fileptr))>0)
	{
		if(send(newsockfd,buffer,datasize,0)<0)
		{
		        fprintf(stderr, "ERROR: Failed to send file :%s (errno = %d)\n",fs_name,errno);
			break;
		}
		bzero(buffer,length);
	}
	gettimeofday(&stop,NULL);
	sec = (double)(stop.tv_usec-start.tv_usec)/1000000 + (double)(stop.tv_sec-start.tv_sec);
	printf("Time taken %f.\n",sec);


     fclose(fileptr);	//Close file
     close(newsockfd);	//Close to accept client
     close(sockfd);	//close socket
	

     return 0; 
}
