18,362
社区成员




#define NUM_REQUIRED 1024 //需要读入的数据的大小
#define MAX_SIZE 2048 //输入缓冲区的大小
TCHAR buff[MAX_SIZE]; //输入缓冲区
bool close; //对方关闭了连接
SOCKET sock; //Windows sockets
void ReadData(void)
{
int nTotal = 0; //已经读入缓冲区的字节数
int nRead = 0; //在调用recv时实际读入的字节数
int nLeft = 0; //剩下数据的字节数
int nBytes = 0; //当前已读数据在缓冲区的位置
nLeft = NUM_REQUIRED;
while (nTotal != NUM_REQUIRED) //已经读入缓冲区的字节数不等于需要读入的大小时
{
nRead = recv(sock,&buff[MAX_SIZE-nBytes],nLeft,0);//接收数据
if(SOCKET_ERROR == n_Read)//读操作失败
{
int err=WSAGetLastError();
if(WSAEWOULDBLOCK == err)//接收数据缓冲区不可用
{
continue;//接着读取数据
}
else if (WSAETIMEDOUT == err || WSAENETDOWN == err)//连接已经断开
{
close = TRUE;//函数退出
break;
}
}
if (0 == nRead)
{
close = TRUE;//客户端关闭了连接
break;//函数退出
}
nTotal += nRead;
nLeft -= nRead;
nBytes += nRead;
}
return;
}