现有一个类似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;
}

解决方案 »

  1.   

    建议用线程。
    或者用ReceiveFrom(),这个是阻塞的。
      

  2.   

    或者在else那里加个消息循环:
    while(GetMessage(&msg, NULL, 0, 0))

      TranslateMessage(&msg);
      DispatchMessage(&msg); 
    }
      

  3.   

    我还想使用采用事件触发OnReceive (),onlogin()中,后面要等待OnReceive()处理完成了,才能继续,这一部分要怎么设计,
    如果我的设计思路就不对,请哪位大侠指出,最好能给个源码,我的MIAL. [email protected]
      

  4.   

    要解决的问题,有二个,1 怎么样等待OnReceive ()处理完服务器的返回信息
    2 等特怎么样防线程阻塞
      

  5.   

    加个消息循环:
    while(GetMessage(&msg, NULL, 0, 0))

      if()-------〉这里判断是否为wm_xx
        break;
      TranslateMessage(&msg);
      DispatchMessage(&msg); 
    }
    然后在onreceive中处理完成后发个自定义消息wm_xx。
      

  6.   

    dirdirdir3(风) 
    有没有完整的代码
    我原来的实现方法:
    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是怎么实现登录的呢!!!!客户-->发送登录请求--->等特服务器返回--->服务器返回后,判断结果(成功,密码错,还是重新换台服务器,还有超时的情况)上面这个过程,要怎么样设计,才是最合理的!!!!!!!!!!!!!!!我很想知道!!!!!!!!!!
      

  7.   

    难不成CSDN也没有真正的高手,快来帮我解决吧!