使用recv函数和send函数的技巧
一些述说
recv函数用于socket通信中接收消息,接口定义如下:
int recv(SOCKET s, char *buf, int len, int flags) 参数一:指定接收端套接字描述符; 参数二:指向一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 参数三:指明buf的长度; 参数四:一般置为0; 返回值:失败时,返回值小于0;超时或对端主动关闭,返回值等于0;成功时,返回值是返回接收数据的长度。
send函数用于socket通信中发送消息,接口定义如下:
int send(SOCKET s, const char FAR *buf, int len, int flags ); 参数一:指定发送端套接字描述符; 参数二:指明一个存放应用程序要发送数据的缓冲区; 参数三:指明实际要发送的数据的字节数; 参数四:一般置0; 返回值:失败时,返回值小于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; }
报文头的接收方式和报文的接收方式相同。
巧用while + send
方法:类似while+recv,不同的是发送的时候不区分报文头和报文体,如下所示:
while(iAlready < dwPkgLength) { iResult = send(socket, pPkg + iAlready, dwPkgLength - iAlready, 0); if(iResult <= 0) { // 异常处理 } iAlready += iResult; }