VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 328|回复: 0

VC++高级班之网络编程篇-[6]服务器端与客户端的消息处理

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-4-11 15:53:31 | 显示全部楼层 |阅读模式
①、        服务器端消息处理函数 CServer::ProcessMsg:
  1. BOOL CServer::ProcessMsg(CMsgHead &msg, TCHAR *pCnt, CClientItem *pClient)
  2. {
  3.         switch(msg.m_type)
  4.         {
  5.         case MSG_TYPE_LOGIN:
  6.                 {
  7.                         BOOL bAuthResult = FALSE;
  8.                         CLoginInfo *pLoginInfo = (CLoginInfo*)pCnt;
  9.                         BOOL bRet = CheckUserInfo(pLoginInfo->m_User, pLoginInfo->m_Pass);
  10.                         if (bRet) {
  11.                                 bAuthResult = TRUE;
  12.                         }

  13.                         CMsgHead msgHead(MSG_TYPE_LOGIN, sizeof(bAuthResult));
  14.                         int iHeadSend = SendData(pClient->m_Socket, (char*)&msgHead, sizeof(msgHead));
  15.                         int iBodySend = SendData(pClient->m_Socket, (char*)&bAuthResult, sizeof(bAuthResult));
  16.                         if (iHeadSend <= 0 || iBodySend <= 0) {
  17.                                 RemoveTargetClient(pClient);
  18.                                 return FALSE;
  19.                         }

  20.                         SendOtherUserInfo(pClient);
  21.                 }
  22.                 break;

  23.         case MSG_TYPE_TOALL: //群发这块可能会很耗时间,以后可以改成把消息放到消息队列中,用单独的线程去发送会好很多
  24.                 {
  25.                         if (m_ClientList.GetCount() <= 1) {
  26.                                 return TRUE;
  27.                         }

  28.                         UINT nLen = sizeof(CClientInfo) + msg.m_cntLen;
  29.                         CMsgHead msgHead(MSG_TYPE_TOALL, nLen);
  30.                         CClientInfo clientInfo(pClient->m_szIpAddr);

  31.                         POSITION pos = m_ClientList.GetHeadPosition();
  32.                         for(INT_PTR idx = 0; idx < m_ClientList.GetCount(); ++idx)
  33.                         {
  34.                                 CClientItem *pItem = m_ClientList.GetNext(pos);
  35.                                 if (!pItem || pItem == pClient) continue;

  36.                                 int iHeadSend = SendData(pItem->m_Socket, (char*)&msgHead, sizeof(msgHead));
  37.                                 int iBodySend = SendData(pItem->m_Socket, (char*)&clientInfo, sizeof(clientInfo));
  38.                                 int iMsgSend = SendData(pItem->m_Socket, (char*)pCnt, msg.m_cntLen);
  39.                                 if (iHeadSend <= 0 || iBodySend <= 0 || iMsgSend <= 0) {
  40.                                         RemoveTargetClient(pClient);
  41.                                 }
  42.                         }
  43.                 }
  44.                 break;

  45.         default:break;
  46.         }

  47.         return TRUE;
  48. }
复制代码

=========================================================================
②、客户端消息处理函数CClient::ProcessMsg:
  1. BOOL CClient::ProcessMsg(CMsgHead &msg, TCHAR *pCnt)
  2. {
  3.         switch(msg.m_type)
  4.         {
  5.         case MSG_TYPE_LOGIN:
  6.                 {
  7.                         BOOL *pbAuthResult = (BOOL*)pCnt;
  8.                         NotifyMsg(MSG_LOGIN, (LPARAM)(*pbAuthResult));
  9.                 }
  10.                 break;
  11.         case MSG_TYPE_OTHER_CLIENT:
  12.                 {
  13.                         ClientArray clientArray;
  14.                         UINT nClientCount = msg.m_cntLen/sizeof(CClientInfo);
  15.                         for (UINT idx = 0; idx < nClientCount; ++idx) {
  16.                                 CClientInfo *pT = (CClientInfo*)pCnt;
  17.                                 pT += idx;

  18.                                 CClientInfo *pInfo = new CClientInfo(pT);
  19.                                 clientArray.Add(pInfo);
  20.                         }

  21.                         NotifyMsg(MSG_OTHER_CLIENT, (LPARAM)&clientArray);
  22.                 }
  23.                 break;

  24.         default:break;
  25.         }

  26.         return TRUE;
  27. }
复制代码


===================================================
③        、群发新用户上线通知:
  1. BOOL CServer::SendOtherUserInfo(CClientItem *pClient)
  2. {
  3.         if (m_ClientList.GetCount() <= 1) {
  4.                 return TRUE;
  5.         }

  6.         CArray <CClientInfo, CClientInfo> clientArray;

  7.         POSITION pos = m_ClientList.GetHeadPosition();
  8.         for(int idx = 0; idx < m_ClientList.GetCount(); ++idx)
  9.         {
  10.                 CClientItem *pItem = m_ClientList.GetNext(pos);
  11.                 if (!pItem || pItem == pClient) continue;

  12.                 CClientInfo info(pItem->m_szIpAddr);
  13.                 clientArray.Add(info);
  14.         }

  15.         UINT nLen = clientArray.GetCount()*sizeof(CClientInfo);
  16.         CMsgHead msgHead(MSG_TYPE_OTHER_CLIENT, nLen);

  17.         int iHeadSend = SendData(pClient->m_Socket, (char*)&msgHead, sizeof(msgHead));
  18.         int iBodySend = SendData(pClient->m_Socket, (char*)clientArray.GetData(), nLen);
  19.         if (iHeadSend <= 0 || iBodySend <= 0) {
  20.                 RemoveTargetClient(pClient);
  21.                 return FALSE;
  22.         }

  23.         return TRUE;
  24. }
复制代码

===================================================
  1. BOOL CServer::SendTargetInfoToOtherUsers(CClientItem *pClient, BOOL bOnLine)
  2. {
  3.         POSITION pos = m_ClientList.GetHeadPosition();
  4.         for(int idx = 0; idx < m_ClientList.GetCount(); ++idx)
  5.         {
  6.                 CClientItem *pItem = m_ClientList.GetNext(pos);
  7.                 if (!pItem || pItem == pClient) continue;

  8.                 CClientInfo clientInfo(pClient->m_szIpAddr);
  9.                 UINT nType = 0;
  10.                 if (bOnLine == TRUE) {
  11.                         nType = MSG_TYPE_CLIENT_ONLINE;
  12.                 }else{
  13.                         nType = MSG_TYPE_CLIENT_OFFLINE;
  14.                 }

  15.                 CMsgHead msgHead(nType, sizeof(CClientInfo));
  16.                 int iHeadSend = SendData(pItem->m_Socket, (char*)&msgHead, sizeof(msgHead));
  17.                 int iBodySend = SendData(pItem->m_Socket, (char*)&clientInfo, sizeof(CClientInfo));
  18.                 Sleep(30);
  19.         }

  20.         return TRUE;
  21. }
复制代码

------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
VC驿站Vip会员售后答疑截图【持续更新】:http://www.cctry.com/thread-288054-1-1.html
教程介绍及详情请见:http://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之网络编程篇-[5]客户端连接及登陆
下一篇:VC++高级班之网络编程篇-[7]群发消息及好友列表展示

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-16 20:45

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表