69,369
社区成员
发帖
与我相关
我的任务
分享
int RecvDataFromHost(int nSockfd, char *pRecvData, int *nRecvDataLen,int iTimeOut)
{
int rlen = 0, ret, len = 0;
#ifdef RACAL
int iLengthHeader = 2;
#else
int iLengthHeader = 0;
#endif
int nLenSize = 0;
fd_set r_fds;
struct timeval tv;
if(pRecvData == NULL)
return -1;
if(nSockfd <= 0)
return -2;
FD_ZERO(&r_fds);
FD_SET((u_int)nSockfd, &r_fds);
if(iTimeOut > 0) {
tv.tv_sec = iTimeOut;
tv.tv_usec = 0;
ret = select(nSockfd + 1, &r_fds, NULL, NULL, &tv);
if (ret <= 0 || !FD_ISSET(nSockfd, &r_fds))
return -3;
} else {
ret = select(nSockfd + 1, &r_fds, NULL, NULL, NULL);//block
if (ret <= 0 || !FD_ISSET(nSockfd, &r_fds))
return -4;
}
if (0 == iLengthHeader)
{
do
{
ret = recv(nSockfd, &pRecvData[rlen], 4096, 0);
if (ret <= 0)
return -5;
rlen += ret;
} while(0 != ret);//循环是我后加上去的,但是如果这样的话,会阻塞回去,单次收包又收不全数据。
}
else if (2 == iLengthHeader)
{
int iRecvDataLen = -1;
ret = recv(nSockfd, &pRecvData[rlen], 2, 0);
if (ret <= 0)
return -5;
iRecvDataLen = (unsigned char)pRecvData[0];
iRecvDataLen = iRecvDataLen << 8 | (unsigned char)pRecvData[1];
rlen += ret;
do{
ret = recv(nSockfd, &pRecvData[rlen], 1024, 0);
if (ret <= 0)
return -5;
rlen += ret;
iRecvDataLen -= ret;
} while(iRecvDataLen > 0);
}
if((len + nLenSize) > SECBUF_MAX_SIZE)
return -6;
*nRecvDataLen = rlen;
return 0;
}