.iocpserver

  1. //    
  2.    
  3. #include "stdafx.h"    
  4. #include "ChatServer.h"    
  5.    
  6. #ifdef _DEBUG    
  7. #undef THIS_FILE    
  8. static char THIS_FILE[]=__FILE__;   
  9. #define new DEBUG_NEW    
  10. #endif    
  11.    
  12. //    
  13. // Construction/Destruction    
  14. //    
  15.    
  16. CChatServer::CChatServer()   
  17. {   
  18.     m_cmd.SetType(this);   
  19.    
  20.     m_cmd.SetLoginFunc(LoginFunc);   
  21.     m_cmd.SetUserMessageFunc(UserMessageFunc);   
  22.        
  23.     InitializeCriticalSection(&m_cs);   
  24. }   
  25.    
  26. CChatServer::~CChatServer()   
  27. {   
  28.     DeleteCriticalSection(&m_cs);   
  29. }   
  30.    
  31. BOOL CChatServer::ClientExit(LPCLIENTCONTEXT lpContext)   
  32. {   
  33.     CoInitialize(NULL);    
  34.    
  35.     LPUSERINFO lpUser;   
  36.     if(!m_mapUsers.Lookup((LONG)lpContext, lpUser))   
  37.     {   
  38.         //找不到该用户,说明已经用户已经退出了    
  39.         CoUninitialize();    
  40.         return TRUE;   
  41.     }   
  42.        
  43.    
  44.     EnterCriticalSection(&m_cs);   
  45.     m_mapUsers.RemoveKey((LONG)lpContext);   
  46.     LeaveCriticalSection(&m_cs);   
  47.        
  48.     //发送退出的用户名称给其他用户    
  49.     CString strCmd = m_cmd.CreateUserLogout(*lpUser);   
  50.     printf("%s LEAVE\n", lpUser->m_name);   
  51.     delete lpUser;   
  52.    
  53.        
  54.     POSITION pos = m_mapUsers.GetStartPosition();   
  55.     for(;pos!=NULL;)   
  56.     {   
  57.         LPUSERINFO lpUser;   
  58.         LONG  pContext;   
  59.         m_mapUsers.GetNextAssoc(pos,  pContext, lpUser);   
  60.         Send((LPCLIENTCONTEXT)pContext, strCmd);   
  61.     }      
  62.        
  63.     CoUninitialize();    
  64.     return FALSE;   
  65.    
  66. }   
  67.    
  68. void CChatServer::ProcessReceiveData(LPCLIENTCONTEXT lpContext, CBuffer &buffer)   
  69. {   
  70.     CoInitialize(NULL);    
  71.    
  72.     try   
  73.     {   
  74.         //循环取得有效指令    
  75.         CString strXML;   
  76.         while(m_cmd.HasNetPacket(buffer, strXML))   
  77.         {   
  78.             if(!m_cmd.DoProcessNetPacket((LONG)lpContext, strXML))   
  79.             {   
  80.                 printf("Error xml format: %s\n", (LPCSTR)strXML);   
  81.             }   
  82.         }   
  83.     }   
  84.     catch(_com_error &e)   
  85.     {   
  86.         printf("%s", (char *)e.Description());   
  87.     }   
  88.    
  89.     CoUninitialize();    
  90.        
  91. }   
  92.    
  93. void CChatServer::LoginFunc(USERINFO &user)   
  94. {   
  95.     //用户登陆    
  96.     //将用户信息发送给用户,以及将服务器上用户列表发送给用户    
  97.     sprintf(user.m_ip, ((LPCLIENTCONTEXT)(user.m_id))->m_ip);   
  98.     user.m_nPort = ((LPCLIENTCONTEXT)(user.m_id))->m_nPort;   
  99.     CString strCmd = m_cmd.CreateLoginSuccess(user, &m_mapUsers);   
  100.        
  101.     Send((LPCLIENTCONTEXT)user.m_id, strCmd);   
  102.    
  103.     //将新用户发送所有他用户    
  104.     strCmd = m_cmd.CreateNewUser(user);   
  105.    
  106.     POSITION pos = m_mapUsers.GetStartPosition();   
  107.     for(;pos!=NULL;)   
  108.     {   
  109.         LPUSERINFO lpUser;   
  110.         LONG  lpContext;   
  111.         m_mapUsers.GetNextAssoc(pos,  lpContext, lpUser);   
  112.            
  113.         if( user.m_id != (DWORD)lpContext)   
  114.         {   
  115.             Send((LPCLIENTCONTEXT)lpContext, strCmd);   
  116.         }   
  117.     }   
  118.    
  119.     //添加到列表    
  120.     EnterCriticalSection(&m_cs);   
  121.     m_mapUsers[user.m_id] = &user;     
  122.     LeaveCriticalSection(&m_cs);   
  123. }   
  124.    
  125. //发送某用户的发言其他用户:区别私聊    
  126. void CChatServer::UserMessageFunc(USERINFO &userSrc,USERINFO &userDest,CString strSpeak)   
  127. {   
  128.     if(userDest.m_id == 0)   
  129.     {   
  130.         CString strCmd = m_cmd.CreateUserMessage(userSrc, userDest, strSpeak);   
  131.            
  132.         //发送给所有用户    
  133.         POSITION pos = m_mapUsers.GetStartPosition();   
  134.         for(;pos!=NULL;)   
  135.         {   
  136.             LPUSERINFO lpUser;   
  137.             LONG  lpContext;   
  138.             m_mapUsers.GetNextAssoc(pos,  lpContext, lpUser);   
  139.                
  140.             Send((LPCLIENTCONTEXT)lpContext, strCmd);   
  141.         }   
  142.     }   
  143.     else   
  144.     {   
  145.         //发送给单一用户:私聊    
  146.         CString strCmd = m_cmd.CreateUserMessage(userSrc, *m_mapUsers[userDest.m_id], strSpeak);   
  147.    
  148.         Send((LPCLIENTCONTEXT)userDest.m_id, strCmd);   
  149.         //如果不是发送给自己的,则还要发送给自己    
  150.         //即,私聊自己也能看见    
  151.         if(userDest.m_id != userSrc.m_id)   
  152.             Send((LPCLIENTCONTEXT)userSrc.m_id, strCmd);   
  153.     }   
  154. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值