title: Simple TCP server with multiple clients C/unix
body: <p>I'm having problems understanding socket programming and need some help. I am suppose to modify my server code that I have written to accept 3 clients. I know I am suppose to use a fork for each client, but I am not sure how to implement this into my code. Here is my original code that I wrote for one client. Any help would be appreciated.</p>
  
  <p>Server:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/types.h&gt; 
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;netdb.h&gt;
  
  void error(const char *msg)
  {
      perror(msg);
      exit(1);
  }
  
  int main(int argc, char *argv[])
  {
       int sockfd, newsockfd, portno;
       socklen_t clilen;
       char buffer[256];
       struct sockaddr_in serv_addr, cli_addr;
       int n;
       if (argc &lt; 2) {
           fprintf(stderr,"ERROR, no port provided\n");
           exit(1);
       }
       sockfd = socket(AF_INET, SOCK_STREAM, 0);
       if (sockfd &lt; 0) 
          error("ERROR opening socket");
       bzero((char *) &amp;serv_addr, sizeof(serv_addr));
       portno = atoi(argv[1]);
       serv_addr.sin_family = AF_INET;
       serv_addr.sin_addr.s_addr = INADDR_ANY;
       serv_addr.sin_port = htons(portno);
       if (bind(sockfd, (struct sockaddr *) &amp;serv_addr,
                sizeof(serv_addr)) &lt; 0) 
                error("ERROR on binding");
       listen(sockfd,5);
       clilen = sizeof(cli_addr);
       newsockfd = accept(sockfd, 
                   (struct sockaddr *) &amp;cli_addr, 
                   &amp;clilen);
       if (newsockfd &lt; 0) 
            error("ERROR on accept");
       bzero(buffer,256);
       n = read(newsockfd,buffer,255);
       if (n &lt; 0) error("ERROR reading from socket");
       printf("Here is the message: %s\n",buffer);
       n = write(newsockfd,"I got your message",18);
       if (n &lt; 0) error("ERROR writing to socket");
       close(newsockfd);
       close(sockfd);
       return 0; 
  }
  </code></pre>
  
  <p>Client:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;string.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/socket.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;netdb.h&gt; 
  
  void error(const char *msg)
  {
      perror(msg);
      exit(0);
  }
  
  int main(int argc, char *argv[])
  {
      int sockfd, portno, n;
      struct sockaddr_in serv_addr;
      struct hostent *server;
  
      char buffer[256];
      if (argc &lt; 3) {
         fprintf(stderr,"usage %s hostname port\n", argv[0]);
         exit(0);
      }
      portno = atoi(argv[2]);
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      if (sockfd &lt; 0) 
          error("ERROR opening socket");
      server = gethostbyname(argv[1]);
      if (server == NULL) {
          fprintf(stderr,"ERROR, no such host\n");
          exit(0);
      }
      bzero((char *) &amp;serv_addr, sizeof(serv_addr));
      serv_addr.sin_family = AF_INET;
      bcopy((char *)server-&gt;h_addr, 
           (char *)&amp;serv_addr.sin_addr.s_addr,
           server-&gt;h_length);
      serv_addr.sin_port = htons(portno);
      //printf("h_addr: %s\n", inet_ntoa(serv_addr.sin_addr));
      if (connect(sockfd,(struct sockaddr *) &amp;serv_addr,sizeof(serv_addr)) &lt; 0) 
          error("ERROR connecting");
      printf("Please enter the message: ");
      bzero(buffer,256);
      fgets(buffer,255,stdin);
      n = write(sockfd,buffer,strlen(buffer));
      if (n &lt; 0) 
           error("ERROR writing to socket");
      bzero(buffer,256);
      n = read(sockfd,buffer,255);
      if (n &lt; 0) 
           error("ERROR reading from socket");
      printf("%s\n",buffer);
      close(sockfd);
      return 0;
  }
  </code></pre>