问题原先在这里请教过、现已解决、特此分享:
原帖见:http://community.csdn.net/Expert/topic/3337/3337468.xml?temp=.2572901原帖中讨论的主要是用心跳包的方法来判断下线的用户。因为在客户端已经因别的用途设置过了时钟、再用时钟进行心跳检测客户端负荷过重。(所做项目客户端为手机-处理能力较弱)所以直接在服务器段进行判断。方法也比较简单、是以定时发送消息、捕获异常的方式来判断客户是否在线。继 承 类:CSocket最后解决方案:设置时钟(时间间隔2分钟)
文档类::CheckIsOnline()
//代码片断
for (pos=m_clientlist.GetHeadPosition();pos!=NULL; )
{
TRY
{
向链表中的每个SOCKET变量发送测试在线消息
}
CATCH(CFileException,e) //捕捉写消息时的错误
{
进行相应的处理
(在我的项目中是向链表中的部分SOCKET变量发送下线的SOCKET变量消息)
}
}
说明:本来担心用服务器单向捕捉会存在一定误差、不过经过几天的验证没有发现误差。一般处理这类问题时主要是把负荷放在客户端(因为PC客户端的处理能力较强、而服务器负荷常常较重)。如果是很弱的客户端这样处理感觉稍微好一些。
原帖见:http://community.csdn.net/Expert/topic/3337/3337468.xml?temp=.2572901原帖中讨论的主要是用心跳包的方法来判断下线的用户。因为在客户端已经因别的用途设置过了时钟、再用时钟进行心跳检测客户端负荷过重。(所做项目客户端为手机-处理能力较弱)所以直接在服务器段进行判断。方法也比较简单、是以定时发送消息、捕获异常的方式来判断客户是否在线。继 承 类:CSocket最后解决方案:设置时钟(时间间隔2分钟)
文档类::CheckIsOnline()
//代码片断
for (pos=m_clientlist.GetHeadPosition();pos!=NULL; )
{
TRY
{
向链表中的每个SOCKET变量发送测试在线消息
}
CATCH(CFileException,e) //捕捉写消息时的错误
{
进行相应的处理
(在我的项目中是向链表中的部分SOCKET变量发送下线的SOCKET变量消息)
}
}
说明:本来担心用服务器单向捕捉会存在一定误差、不过经过几天的验证没有发现误差。一般处理这类问题时主要是把负荷放在客户端(因为PC客户端的处理能力较强、而服务器负荷常常较重)。如果是很弱的客户端这样处理感觉稍微好一些。
void CTestSocket::sendmessage(CMessage *msg)
{
if(m_out!=NULL)
{
msg->Serialize(*m_out);
m_out->Flush(); //异常是在这里发生的
}
}
如果有更好的解决方案、大家不妨也随便讨论一下。