一些述说

recv函数用于socket通信中接收消息,接口定义如下:

int recv( SOCKET s, char *buf, int len, int flags)
参数一:指定接收端套接字描述符;
参数二:指向一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
参数三:指明buf的长度;
参数四:一般置为0。
返回值:失败时,返回值小于等于0;成功时,返回值是返回接收数据的长度

一般通信的报文的格式:报文头 + 报文体,那么针对这种格式的报文怎么样接收最合理?

巧用while+recv

方法:先接收报文头,直到接收报文的长度和定义的报文头长度相同,然后接收报文体,直到报文体的长度和报文头里面写明的长度相同,如下所示:

iAlready = 0;
ulRecvLen = HEAD_LENGTH;
char pcFrame[HEAD_LENGTH] = {0x0};

while(iAlready < ulRecvLen)
{
    iResult = recv(socket, pcFrame + iAlready, ulRecvLen - iAlready, 0);

    if(iResult <= 0)
    {
        // 异常处理
    }

    iAlready += iResult;
}

报文头的接收方式和报文的接收方式相同。

02-09 23:17