现有一个类似QQ的通讯软件要设计,采用UDP协议,使用CSocket类,采用事件触发,重载了OnReceive()函数,我现在设计登录模块,比如我发一个登录包,要求等待OnReceive()处理完服务器返回的结果后,再返回!
哪位高手提供一下设计方案,如果采用线程等特,会导致,主线程阻塞!我只想知道,这类程序一般怎么设计,能不能给出具体的解决和设计思路!!!-----------------------------------------------
void CmySocket::OnReceive(int nErrorCode)
{
CFQQEvent *fqqevent=(CFQQEvent *)m_Pfqqevent;
BYTE inPacket[2000];
//接收UDP数据
in_addr inaddr;
memcpy(&inaddr.S_un.S_addr,fqqevent->m_serverip,4);
CString strserverip=inet_ntoa(inaddr);
UINT serverport=fqqevent->m_serverPort;
int count =ReceiveFrom(inPacket,2000,strserverip,serverport,0);
//送交CFQQEvent 类的 FQQ_CMD_IN 函数处理
if(m_Pfqqevent!=NULL)
{
CQQEvent *fqqevent=(CFQQEvent *)m_Pfqqevent;
fqqevent->FQQ_CMD_IN(inPacket,count);
}
CSocket::OnReceive(nErrorCode);
}
----------------------------------------------------------------
BOOL CFQQEvent::onlogin()
{
BYTE outbuf[2000];
int len=0;
len=make_login_outpacket(outbuf);
if(!SocketSendTo(outbuf,len))
AfxMessageBox("WIN SOCKET SENDTO DATA 错误!");
else
{
这里要处理,成功登录和不成功登录的情况,所以必需等OnReceive()处理完成了,才能继续,当然还要考虑超时的问题,我头都大了,不知怎么样设计很合理, 又不能阻塞OnReceive()的执行!,即要效率,又要速度!!望高人指点!!!!!//服务器返回登录成功
return true;
//服务器返回失败和超时
return false; }
return FALSE;
}
哪位高手提供一下设计方案,如果采用线程等特,会导致,主线程阻塞!我只想知道,这类程序一般怎么设计,能不能给出具体的解决和设计思路!!!-----------------------------------------------
void CmySocket::OnReceive(int nErrorCode)
{
CFQQEvent *fqqevent=(CFQQEvent *)m_Pfqqevent;
BYTE inPacket[2000];
//接收UDP数据
in_addr inaddr;
memcpy(&inaddr.S_un.S_addr,fqqevent->m_serverip,4);
CString strserverip=inet_ntoa(inaddr);
UINT serverport=fqqevent->m_serverPort;
int count =ReceiveFrom(inPacket,2000,strserverip,serverport,0);
//送交CFQQEvent 类的 FQQ_CMD_IN 函数处理
if(m_Pfqqevent!=NULL)
{
CQQEvent *fqqevent=(CFQQEvent *)m_Pfqqevent;
fqqevent->FQQ_CMD_IN(inPacket,count);
}
CSocket::OnReceive(nErrorCode);
}
----------------------------------------------------------------
BOOL CFQQEvent::onlogin()
{
BYTE outbuf[2000];
int len=0;
len=make_login_outpacket(outbuf);
if(!SocketSendTo(outbuf,len))
AfxMessageBox("WIN SOCKET SENDTO DATA 错误!");
else
{
这里要处理,成功登录和不成功登录的情况,所以必需等OnReceive()处理完成了,才能继续,当然还要考虑超时的问题,我头都大了,不知怎么样设计很合理, 又不能阻塞OnReceive()的执行!,即要效率,又要速度!!望高人指点!!!!!//服务器返回登录成功
return true;
//服务器返回失败和超时
return false; }
return FALSE;
}
或者用ReceiveFrom(),这个是阻塞的。
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
如果我的设计思路就不对,请哪位大侠指出,最好能给个源码,我的MIAL. [email protected]
2 等特怎么样防线程阻塞
while(GetMessage(&msg, NULL, 0, 0))
{
if()-------〉这里判断是否为wm_xx
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
然后在onreceive中处理完成后发个自定义消息wm_xx。
有没有完整的代码
我原来的实现方法:
m_event.ResetEvent();
等待m_event 变为有信号
DWORD result ;
while(1)
{
MSG msg ;
result = MsgWaitForMultipleObjects(1, &m_event.m_hObject,FALSE, timeouttime, QS_INPUT);
if (result == WAIT_OBJECT_0 || result == WAIT_TIMEOUT)
break;
else
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
DispatchMessage(&msg);
}
}
if (result == WAIT_OBJECT_0)//成功完成
return TRUE;我认为你这个方法不行的,我需要知道.QQ是怎么实现登录的呢!!!!客户-->发送登录请求--->等特服务器返回--->服务器返回后,判断结果(成功,密码错,还是重新换台服务器,还有超时的情况)上面这个过程,要怎么样设计,才是最合理的!!!!!!!!!!!!!!!我很想知道!!!!!!!!!!