{
CNetServer *p = (CNetServer*)lpParam;
sockaddr_in addr;
int n = sizeof(addr);
fd_set fds;
timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
while(p->m_bRun)
{
FD_ZERO(&fds);
FD_SET(p->m_sockAccept,&fds);
switch( select(0,&fds,NULL,NULL,&timeout) )
{
case -1: //出错
{
return -1;
}
break;
case 0: //超时
{}
break;
default:
{
if(FD_ISSET(p->m_sockAccept,&fds))
{
p->m_sockData = ::accept(p->m_sockAccept,(sockaddr*)&addr,&n);
if(INVALID_SOCKET == p->m_sockData)
{
//错误
return 0;
}
else
{
//TRACE("客户端%s连接\n",inet_ntoa(addr.sin_addr));
p->m_hRecv = (HANDLE)_beginthreadex(NULL,0,(unsigned (__stdcall *)(void *))RecvThread,p,0,NULL);
if(0 == p->m_hRecv)
{
::closesocket(p->m_sockData);
}
}
}
}
break;
}
}
return 0;
}
unsigned __stdcall CNetServer::RecvThread(LPVOID lpParam)
{
CNetServer *p = (CNetServer*)lpParam;
char data[1024] = "";
int nRet = 0;
fd_set fds;
timeval timeout;
timeout.tv_sec = 2;
timeout.tv_usec = 0;
while(p->m_bRun)
{
FD_ZERO(&fds);
FD_SET(p->m_sockData,&fds);
switch( select(0,&fds,NULL,NULL,&timeout) )
{
case -1: //出错
{
return -1;
}
break;
case 0: //超时
{}
break;
default:
{
if(FD_ISSET(p->m_sockData,&fds)) //测试p->m_sockData是否可读,即网络上是否有数据
{
nRet = ::recv(p->m_sockData,data,sizeof(data),0);
if(nRet < 0)
{
//TRACE("客户端掉线\n");
return 0;
}
if(0 == nRet)
{
//TRACE("客户端关闭\n");
return 0;
}
//TRACE("服务器接收到的数据:%s\n",data);
}
}
break;
}
}
return 0;
}