title: TCP send/recv error reporting
body: <p>I have a client/server program (Windows, winsock2) which communicates over TCP.
  The client connects and sends data to server (using send) in 8K at a time.
  The server just reads data (using recv).</p>
  
  <p>No special settings done on sockets.</p>
  
  <p>Problem:
  When some network error occurs during the communication (e.g. cable pulled out), receiver do not get data successfully sent by that time.
  To simplify, 
  Client sent 80K data in 10 calls to send. (all sends are successful). 11th send failed because of some network issue. No more data sent after this.</p>
  
  <p>Problem is that at receiver, not all 80K data is received. It is always less than 80K.</p>
  
  <p>I expect as sender as successfully sent 80K, TCP will guarantee that much data is delivered to destination TCP (data may not be received by application yet, but its in destination TCP buffers).</p>
  
  <p>Am I missing anything?</p>
  
  <p>Thanks</p>
  
  <p>Edit:</p>
  
  <p>Sample code</p>
  
  <p>Server/receiver</p>
  
  <pre><code>/* create socket */
  /* listen */
  /* accept connection */
  char recvbuf[8192];
  do {
  
      iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0);
      if (iResult &gt; 0) {
          total += iResult;
          printf("Total bytes received: %d\n", total);
      }
      else if (iResult == 0) {
          printf("Connection is closing...\n");
          break;
      }
      else  {
          printf("recv failed: %d\n", WSAGetLastError());
          break;
      }
  
  } while (iResult &gt; 0);
  </code></pre>
  
  <hr>
  
  <p>Client/sender :</p>
  
  <pre><code>/* create socket */
  /* connect to server */
  char sendbuf[8192];
  
  do {
      // Send an initial buffer
      iResult = send( ConnectSocket, sendbuf, sizeof(sendbuf), 0 );
      if (iResult == SOCKET_ERROR) {
          printf("send failed: %d\n", WSAGetLastError());
          break;
      }
      total += iResult;
      printf("Total bytes Sent: %ld\n", total);
  } while(iResult &gt; 0);
  //wait before cleaning up
  getc(stdin);
  </code></pre>