title: Socket programming: recv/read issue
body: <p><strong>EDIT:</strong> the code below has been fixed to receive and send properly AND to account for the actual bytes of messages sent annd recieved (latter thanks to EJP)</p>
  
  <p>I'm programming with C in Unix.</p>
  
  <p>I have server and client that are supposed to exchange msgs. While client seems to send messages fine, server doesn't receive the messages the client is sending. I've tried using <code>recv()</code> and <code>read()</code> (i know they are practically the same thing but with extra flags on <code>recv()</code>) but I have no luck and I'm not really sure what the problem really is. </p>
  
  <p>I put <code>sleep(3)</code> in the client code after every time it sends a message but i see that once client and server are connected, server immediately closes without waiting for the incoming messages. What am i doing wrong?</p>
  
  <p>This is the client-side code:</p>
  
  <pre><code>#define SERVER_TCP_PORT 11112
  #define MAX_DATA_SIZE   500
  
  int main(int argc, char * argv[])
  {
      int sockfd;
      char * host;
      char msg[MAX_DATA_SIZE];/* = "get my msg!\n";*/
      int msg_len;
  
      struct hostent * hp;
      struct sockaddr_in client_address, server_address;
  
  
      printf("y halo thar\n");
  
  
      // looking up from the host database
      if (argc == 2)
          host = argv[1];
      else
          exit(1);
      printf("sdf\n");
  
  
      hp = gethostbyname(host);
      if (!hp)
          exit(1);
      printf("host found\n");
  
  
      // setting up address and port structure information
      bzero((char * ) &amp;server_address, sizeof(server_address)); // copy zeroes into string
      server_address.sin_family = AF_INET;
      bcopy(hp-&gt;h_addr, (char *) &amp;server_address.sin_addr, hp-&gt;h_length);
      server_address.sin_port = htons(SERVER_TCP_PORT);
      printf("set\n");
  
  
      // opening up socket
      if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0 )
          exit(1);
      printf("opened\n");
  
  
      // connecting
      if (connect(sockfd, (struct sockaddr *) &amp;server_address, sizeof(server_address)) &lt; 0)
          exit(1);
      printf("connected\n");
  
  
      int i;
  
      for (i = 0; i &lt; MAX_DATA_SIZE; ++i)
      {
          msg[i] = '.';
      }
  
      msg[MAX_DATA_SIZE-1] = '\0';
  
      for(i = 0; i &lt; 11; i++)
      {
          // send message to connected socket
          msg_len = write(sockfd, msg, MAX_DATA_SIZE);
          if(msg_len &lt; 1)
              printf("notsent\n");
          else
              printf("%i  bytes sent\n", msg_len);
  
          // recieve messages from connected socket
          msg_len = read(sockfd, msg, MAX_DATA_SIZE);
          if (msg_len &lt; 1)
              printf("not recieved\n");
          else
          {
              printf("%i bytes received\n", msg_len);
              printf(msg);
              printf("\n");
  
          }
      }
  
  
      // close connection
      close(sockfd);
      printf("closed\n");
  
  }
  </code></pre>
  
  <p>and this is the server side</p>
  
  <pre><code>#define SERVER_TCP_PORT 11112
  #define MAX_DATA_SIZE   500
  
  
  int main()
  {
  
      printf("o halo thar\n");
  
      int sockfd, new_sockfd;
      int client_addr_len;
      char msg [MAX_DATA_SIZE];
      int msg_len;
      char got_msg [11] = "got ur msg\0";
      struct sockaddr_in server_address, client_address;
  
  
      // setting up address and port structure information
      bzero((char * ) &amp;server_address, sizeof(server_address)); // copy zeroes into string
      server_address.sin_family = AF_INET;
      server_address.sin_addr.s_addr = htonl(INADDR_ANY);
      server_address.sin_port = htons(SERVER_TCP_PORT);
  
  
      // opening up socket
      if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0 )
          exit(1);
      printf("socket is opened\n");
  
  
      // binding
      if (bind(sockfd, (struct sockaddr *) &amp;server_address, sizeof(server_address)) &lt; 0)
          exit(1);
      printf("socket is bound\n");
  
  
      // listening
      listen(sockfd,5);
      printf("listening\n");
  
      // block and wait for an incoming connection
  
      client_addr_len = sizeof(client_address);
      new_sockfd = accept(sockfd, (struct sockaddr *) &amp;client_address, &amp;client_addr_len);
      if (new_sockfd &lt; 0)
          exit(1);
  
      printf("accepted\n");
  
  
      int i;
  
      for( i = 0; i &lt; 11; i++)
      {
          // recieve messages from connected socket
          printf("waiting\n");
          msg_len = read(new_sockfd, msg, MAX_DATA_SIZE);
          if (msg_len &lt; 1)
          {
              printf("no msg recieved\n");    
          }
          else
          {
              printf("bytes recieved: %i\n", msg_len);
          }
  
  
          // send message to connected socket
          msg_len = write(new_sockfd, got_msg, sizeof(got_msg));
          if (msg_len &lt; 1)
              printf("not sent\n");
          else
              printf("%i bytes sent\n", msg_len);
      }
  
  
      // close connection
      close(sockfd);
      printf("socket closed. BYE! \n");
  
  
  }
  </code></pre>