title: Socket Server Hangs
body: <p>This socket server has some error in it, most likely pthread related. If this keeps accepting client connections, after a while it will start hanging. It doesn't seems to be a memory leak because the memory occupied by the program remains the same but when I connect with a telnet client it will just hang and does not do anything.</p>
  
  <p>It will still get to the 
              puts("Handler assigned");
  part but then it does nothing. Any ideas what can cause this?</p>
  
  <pre><code>/*
      C socket server example, handles multiple clients using threads
  */
  
  #include&lt;stdio.h&gt;
  #include&lt;string.h&gt;    //strlen
  #include&lt;stdlib.h&gt;    //strlen
  #include&lt;sys/socket.h&gt;
  #include&lt;arpa/inet.h&gt; //inet_addr
  #include&lt;unistd.h&gt;    //write
  #include&lt;pthread.h&gt; //for threading , link with lpthread
  
  //the thread function
  void *connection_handler(void *);
  
  int main(int argc , char *argv[])
  {
      int socket_desc , client_sock , c , *new_sock;
      struct sockaddr_in server , client;
  
      //Create socket
      socket_desc = socket(AF_INET , SOCK_STREAM , 0);
      if (socket_desc == -1)
      {
          printf("Could not create socket");
      }
      puts("Socket created");
  
      //Prepare the sockaddr_in structure
      server.sin_family = AF_INET;
      server.sin_addr.s_addr = INADDR_ANY;
      server.sin_port = htons( 8888 );
  
      //Bind
      if( bind(socket_desc,(struct sockaddr *)&amp;server , sizeof(server)) &lt; 0)
      {
          //print the error message
          perror("bind failed. Error");
          return 1;
      }
      puts("bind done");
  
      //Listen
      listen(socket_desc , 3);
  
      //Accept and incoming connection
      puts("Waiting for incoming connections...");
      c = sizeof(struct sockaddr_in);
  
  
      //Accept and incoming connection
      puts("Waiting for incoming connections...");
      c = sizeof(struct sockaddr_in);
      while( (client_sock = accept(socket_desc, (struct sockaddr *)&amp;client, (socklen_t*)&amp;c)) )
      {
          puts("Connection accepted");
  
          pthread_t sniffer_thread;
          new_sock = malloc(1);
          *new_sock = client_sock;
  
          if( pthread_create( &amp;sniffer_thread , NULL ,  connection_handler , (void*) new_sock) &lt; 0)
          {
              perror("could not create thread");
              return 1;
          }
  
          //Now join the thread , so that we dont terminate before the thread
          //pthread_join( sniffer_thread , NULL);
          puts("Handler assigned");
      }
  
      if (client_sock &lt; 0)
      {
          perror("accept failed");
          return 1;
      }
  
      return 0;
  }
  
  /*
   * This will handle connection for each client
   * */
  void *connection_handler(void *socket_desc)
  {
      //Get the socket descriptor
      int sock = *(int*)socket_desc;
      int read_size;
      char *message , client_message[2000];
  
      //Send some messages to the client
      message = "Greetings! I am your connection handler\n";
      write(sock , message , strlen(message));
  
      message = "Now type something and i shall repeat what you type \n";
      write(sock , message , strlen(message));
  
      //Receive a message from client
      while( (read_size = recv(sock , client_message , 2000 , 0)) &gt; 0 )
      {
          //Send the message back to client
          write(sock , client_message , strlen(client_message));
      }
  
      if(read_size == 0)
      {
          puts("Client disconnected");
          fflush(stdout);
      }
      else if(read_size == -1)
      {
          perror("recv failed");
      }
  
      //Free the socket pointer
      free(socket_desc);
  
      return 0;
  }
  </code></pre>