Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. int PacketReceive_buffer( SOCKET sock, long lWaitMilliSecs, unsigned int *rcvdLen, unsigned char *recvBuffer )
  2. {
  3.     if( !rcvdLen || !recvBuffer ) return 0; // assert
  4.     (*rcvdLen) = 0;                       // zero bytes received
  5.     recvBuffer[0] = recvBuffer[1] = 0;    // zero 1st 2 bytes in packet
  6.     if( sock == 0xFFFFFFFF ) return 0;    // assert
  7.     unsigned int plen = 0;                // receiving packet len
  8.     int r = 0, rr = 0;                    // net functions results return codes
  9.     unsigned char *bufptr = NULL;         // current receive buffer pointer
  10.     int rdyR = 0, rdyS = 0;               // ready to recv, ready to send
  11.    
  12.     // first try to receive packet len. receive 1st byte
  13.     r = select( sock, SELECT_READ, lWaitMilliSecs, &rdyR, &rdyS );
  14.     if( r <= 0 ) return r;
  15.     r = recv( sock, (unsigned char *)(&plen), 1 );
  16.     if( r <= 0 ) return r;
  17.     (*rcvdLen) = 1;
  18.     // receive 2nd byte
  19.     r = select( sock, SELECT_READ, lWaitMilliSecs, &rdyR, &rdyS );
  20.     if( r <= 0 ) return r;
  21.     r = recv( sock, (unsigned char *)(&plen) + 1, 1 );
  22.     if( r <= 0 ) return r;
  23.     (*rcvdLen) = 2;
  24.    
  25.     if( plen == 0 ) return 0; // protocol error - packet length 0 cannot be! minimum is 2
  26.    
  27.     // set packet len in packet
  28.     recvBuffer[0] = ((unsigned char *)&plen)[0];
  29.     recvBuffer[1] = ((unsigned char *)&plen)[1];
  30.     bufptr = recvBuffer + 2; // update current bufer pos to pass 1st 2 bytes
  31.    
  32.     unsigned int nBytesRcvd = 2; // packet len already received
  33.     unsigned int nTimeouts = 0;  // number of timeouts on receive process
  34.     unsigned int maxTimeouts = 5; // max.number of timeouts
  35.  
  36.     // receive loop
  37.     while( nBytesRcvd < plen )
  38.     {
  39.         (*rcvdLen) = nBytesRcvd;
  40.         r = select( sock, SELECT_READ, lWaitMilliSecs, &rdyR, &rdyS );
  41.         if( r > 0 ) // select() OK
  42.         {
  43.             rr = recv( sock, (unsigned char *)bufptr, (plen - nBytesRcvd) );
  44.             if( rr > 0 ) // recv() OK, received rr bytes
  45.             {
  46.                 bufptr += rr;
  47.                 nBytesRcvd += rr;
  48.                 nTimeouts = 0;
  49.             }
  50.             else if( rr <= 0 ) // recv() returns 0 when connection closed by remote host? or returns -1 on error
  51.             {
  52.                 nTimeouts++;
  53.                 if( nTimeouts > maxTimeouts ) break;
  54.             }
  55.         }
  56.         else if ( r <= 0 ) // select() timeout or error
  57.         {
  58.             nTimeouts++;
  59.             if( nTimeouts > maxTimeouts ) break;
  60.         }
  61.     } // while
  62.    
  63.     if( nBytesRcvd == plen ) // successful return
  64.     {
  65.         (*rcvdLen) = plen;
  66.         return 1;
  67.     }
  68.     else if( nBytesRcvd < plen ) // received less than should, error
  69.     {
  70.         return -1;
  71.     }
  72.  
  73.     // other error
  74.     return -1;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement