你可以这样,象QQ一样,服务器和客户端连接后,
启动一条工人线程:
AfxBeginThread(CheckOnline,0);
在这个线程里检查客户端是否在线:
UINT CheckOnline(LPVOID param)
{
CServerApp * pApp=(CServerApp*)AfxGetApp();
UserOnline * pUsers=pApp->m_pUsers;
while(pApp->m_bServerStarted)
{
Sleep(TimerSpanServer);//设置一个时间周期,当用户一段时间没有响应后,服务器判断已经下线。
for(int i=0;i<pApp->m_nTotalUserNumber&&pApp->m_bServerStarted;i++)
{
if(!pUsers[i].State)continue;
CMsg msg;
msg.index=TOTAL_ONLINE;
msg.tarIP=pUsers[i].IP;
msg.nPort=pUsers[i].Port;
msg.Value=pApp->m_nNumberOnline;
BOOL bSu=pSocket->SendData(&msg);
if(bSu)continue;
pUsers[i].State=0;
::InterlockedDecrement((LPLONG)&pApp->m_nNumberOnline);
}
}
return 0;
}
在这个线程里面服务器一直往客户端发送是否在线的消息。
启动一条工人线程:
AfxBeginThread(CheckOnline,0);
在这个线程里检查客户端是否在线:
UINT CheckOnline(LPVOID param)
{
CServerApp * pApp=(CServerApp*)AfxGetApp();
UserOnline * pUsers=pApp->m_pUsers;
while(pApp->m_bServerStarted)
{
Sleep(TimerSpanServer);//设置一个时间周期,当用户一段时间没有响应后,服务器判断已经下线。
for(int i=0;i<pApp->m_nTotalUserNumber&&pApp->m_bServerStarted;i++)
{
if(!pUsers[i].State)continue;
CMsg msg;
msg.index=TOTAL_ONLINE;
msg.tarIP=pUsers[i].IP;
msg.nPort=pUsers[i].Port;
msg.Value=pApp->m_nNumberOnline;
BOOL bSu=pSocket->SendData(&msg);
if(bSu)continue;
pUsers[i].State=0;
::InterlockedDecrement((LPLONG)&pApp->m_nNumberOnline);
}
}
return 0;
}
在这个线程里面服务器一直往客户端发送是否在线的消息。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货