Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int PacketReceive_buffer( SOCKET sock, long lWaitMilliSecs, unsigned int *rcvdLen, unsigned char *recvBuffer )
- {
- if( !rcvdLen || !recvBuffer ) return 0; // assert
- (*rcvdLen) = 0; // zero bytes received
- recvBuffer[0] = recvBuffer[1] = 0; // zero 1st 2 bytes in packet
- if( sock == 0xFFFFFFFF ) return 0; // assert
- unsigned int plen = 0; // receiving packet len
- int r = 0, rr = 0; // net functions results return codes
- unsigned char *bufptr = NULL; // current receive buffer pointer
- int rdyR = 0, rdyS = 0; // ready to recv, ready to send
- // first try to receive packet len. receive 1st byte
- r = select( sock, SELECT_READ, lWaitMilliSecs, &rdyR, &rdyS );
- if( r <= 0 ) return r;
- r = recv( sock, (unsigned char *)(&plen), 1 );
- if( r <= 0 ) return r;
- (*rcvdLen) = 1;
- // receive 2nd byte
- r = select( sock, SELECT_READ, lWaitMilliSecs, &rdyR, &rdyS );
- if( r <= 0 ) return r;
- r = recv( sock, (unsigned char *)(&plen) + 1, 1 );
- if( r <= 0 ) return r;
- (*rcvdLen) = 2;
- if( plen == 0 ) return 0; // protocol error - packet length 0 cannot be! minimum is 2
- // set packet len in packet
- recvBuffer[0] = ((unsigned char *)&plen)[0];
- recvBuffer[1] = ((unsigned char *)&plen)[1];
- bufptr = recvBuffer + 2; // update current bufer pos to pass 1st 2 bytes
- unsigned int nBytesRcvd = 2; // packet len already received
- unsigned int nTimeouts = 0; // number of timeouts on receive process
- unsigned int maxTimeouts = 5; // max.number of timeouts
- // receive loop
- while( nBytesRcvd < plen )
- {
- (*rcvdLen) = nBytesRcvd;
- r = select( sock, SELECT_READ, lWaitMilliSecs, &rdyR, &rdyS );
- if( r > 0 ) // select() OK
- {
- rr = recv( sock, (unsigned char *)bufptr, (plen - nBytesRcvd) );
- if( rr > 0 ) // recv() OK, received rr bytes
- {
- bufptr += rr;
- nBytesRcvd += rr;
- nTimeouts = 0;
- }
- else if( rr <= 0 ) // recv() returns 0 when connection closed by remote host? or returns -1 on error
- {
- nTimeouts++;
- if( nTimeouts > maxTimeouts ) break;
- }
- }
- else if ( r <= 0 ) // select() timeout or error
- {
- nTimeouts++;
- if( nTimeouts > maxTimeouts ) break;
- }
- } // while
- if( nBytesRcvd == plen ) // successful return
- {
- (*rcvdLen) = plen;
- return 1;
- }
- else if( nBytesRcvd < plen ) // received less than should, error
- {
- return -1;
- }
- // other error
- return -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement