/******************************************************************************/
/* Program to check the number of concurrent connections can be opened by TCP */
/******************************************************************************/

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <sys/wait.h> 
    #include <sys/stat.h>
    #include <fcntl.h> 

    #define MYPORT 9999   /* the port users will be connecting to */

    #define BACKLOG 10     /* how many pending connections queue will hold */

    main()
    {
        int sockfd, new_fd;		/* listen on sock_fd, new connection on new_fd */
        struct sockaddr_in my_addr;	/* my address information */
        struct sockaddr_in their_addr; 	/* connector's address information */
        int sin_size;
	int proc_uptime_file;		/* FD to read from /proc/uptime file	*/
	char	uptime_data[100];	/* The data from /proc/uptime		*/

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }

        my_addr.sin_family = AF_INET;         /* host byte order */
        my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
        my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
        bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */

        if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
                                                                      == -1) {
            perror("bind");
            exit(1);
        }

        if (listen(sockfd, BACKLOG) == -1) {
            perror("listen");
            exit(1);
        }

        while(1) {  /* main accept() loop */
            sin_size = sizeof(struct sockaddr_in);
            if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
                                                          &sin_size)) == -1) {
                perror("accept");
                continue;
            }
            printf("server: got connection from %s\n", \
                                               inet_ntoa(their_addr.sin_addr));
            if (!fork()) { /* this is the child process */
		proc_uptime_file = open("/proc/loadavg", O_RDONLY);
		/*lseek(proc_uptime_file , 0, SEEK_SET); */
		read(proc_uptime_file, uptime_data , 100);
		close(proc_uptime_file);
                if (send(new_fd, uptime_data, sizeof(uptime_data), 0) == -1){
                    perror("send");	
		    exit (1);
		}
		printf("Sending info to sockfd=%d\n",new_fd);
                close(new_fd);
            }
            close(new_fd);  /* parent doesn't need this */

            /*while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
        }
    }
