#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h> 
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
char *msg = "I got your message";

void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
   int sock, newsock, len, fromlen,  n, pid;
   unsigned short port;
   struct sockaddr_in server;
   struct sockaddr_in from;
   char buffer[BUFSIZE];

   if (argc < 2) {
     fprintf(stderr,"usage %s portnumber\n",argv[0]);
     exit(0);
   }
   port = (unsigned short) atoi(argv[1]);
   sock=socket(AF_INET, SOCK_STREAM, 0);
   if (sock < 0) error("Opening socket");
   server.sin_family=AF_INET;
   server.sin_addr.s_addr=INADDR_ANY;
   server.sin_port=htons(port);  
   len=sizeof(server);
   if (bind(sock, (struct sockaddr *)&server, len) < 0) 
        error("binding socket");
   fromlen=sizeof(from);
   listen(sock,5);
   while (1) {
        newsock=accept(sock, (struct sockaddr *)&from, &fromlen);
        printf("A connection has been accepted\n");
        pid = fork();
        if (pid == 0) { 
            n = recv(newsock,buffer,BUFSIZE,0);
            if (n < 1) {
	        error("Reading from socket");
            }
             else {
	        buffer[n]='\0';
                printf("The message from %s is %s\n",
                  inet_ntoa((struct in_addr)from.sin_addr),
                  buffer);
	     }
	     n = send(newsock, msg, strlen(msg),0);
	     if (n < strlen(msg)) error("Writing");
             close(newsock);
             exit(0);
	}
   }
   return 0; /* we never get here */
}
