title: Multithreaded socket in C
body: <p>I am trying to edit code I wrote earlier from creating a client and server socket, allowing the client to send a message to the server and the server responds with "I got it.." + Message. This works well but the next steps are what I am having issues with.</p>
  
  <p>I want to be able to continuously send messages until the client says "Exit", and support multiple clients.</p>
  
  <p>The code I have that works for a one on one client/server communication:</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;
  
  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; // return value for the read() and write() calls
  
      // gcc server.c -o server
      // ./server 8080
      // Pass in Port # or pass error
      if (argc &lt; 2) {
          fprintf(stderr,"ERROR, no port provided\n");
          exit(1);
      }
  
      sockfd = socket(AF_INET, SOCK_STREAM, 0);
      // Error if Socket Call fails
      if (sockfd &lt; 0) 
      error("ERROR opening socket");
      bzero((char *) &amp;serv_addr, sizeof(serv_addr)); // Set all values in a buffer to zero, args: pointer to buffer, size of buffer, sets serv_addr ot zero
      portno = atoi(argv[1]); // Port number listens for connections
      serv_addr.sin_family = AF_INET;
      serv_addr.sin_addr.s_addr = INADDR_ANY;
      serv_addr.sin_port = htons(portno);
  
      // Binds socket to an address
      if (bind(sockfd, (struct sockaddr *) &amp;serv_addr,
              sizeof(serv_addr)) &lt; 0) 
              error("ERROR on binding");
  
      // Listens to the socket for connections
      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];
      // gcc client.c -o client
      // ./client localhost 8080
      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);
      // Error Connecting to the server
      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>
  
  <p>My thoughts were for the server file have a while loop:</p>
  
  <pre><code>while(buffer != "EXIT"){
      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);
  }
  </code></pre>
  
  <p>but it only does one interaction between one client and server.</p>