在向服务器发送问候语之后,客户端调用RecvLine()函数接收服务器的应答。RecvLine()函数的实现与服务器相似,不同的是没有对recv()函数调用失败作立即处理,而是返回FALSE。如果RecvLine()函数返回FALSE,则先调用ShowErrorMsg()函数显示错误信息,然后客户端退出。
RecvLine()函数程序清单如下。
/*
* 读取一行数据
*/
BOOL RecvLine(SOCKET s, char* buf)
{
BOOL retVal = TRUE; //返回值
BOOL bLineEnd = FALSE; //行结束
int nReadLen = 0; //读入字节数
int nDataLen = 0; //数据长度
while (!bLineEnd && bConning) //与客户端连接 没有换行
{
nReadLen = recv(s, buf + nDataLen, 1, 0); //每次接收一个字节
//错误处理
if (SOCKET_ERROR == nReadLen)
{
retVal= FALSE; //读数据失败
break; //跳出循环
}
if (0 == nReadLen) //客户端关闭
{
retVal = FALSE; //读数据失败
break ; //跳出循环
}
//读入数据
if ('/n' == *(buf + nDataLen)) //换行符
{
bLineEnd = TRUE; //接收数据结束
}else{
nDataLen += nReadLen; //增加数据长度
}
}
return retVal;
}