VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

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

VC++高级班之网络编程篇-[4]客户端队列管理及自定义协议

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-4-11 15:49:04 | 显示全部楼层 |阅读模式
①、        相关函数代码:
  1. UINT CServer::acceptProc(LPVOID pParam)
  2. {
  3.         //其他代码…暂时省略
  4.         while(…) {
  5.                         //其他代码…暂时省略
  6.                         SOCKET accSock = accept(pThis->m_ListenSock, (sockaddr *)&clientAddr , &iLen);
  7.                         if (accSock == INVALID_SOCKET) {
  8.                                 continue;
  9.                         }

  10.                         //以下为关键代码
  11.                         CClientItem *pItem = new CClientItem();
  12.                         pItem->m_Socket = accSock;
  13.                         CString strIp;
  14.                         strIp = inet_ntoa(clientAddr.sin_addr);
  15.                         _tcscpy_s(pItem->m_szIpAddr, MAX_IP_LEN, strIp);

  16.                         pItem->m_hThread = CreateThread(NULL, 0, ClientThreadProc, pItem, 0, NULL);
  17.                         POSITION pos = pThis->m_ClientList.AddTail(pItem);
  18.                 }
  19.         }
  20.         return TRUE;
  21. }
复制代码

===================================================
②、        各种结构讲解:
  1. class CClientItem
  2. {
  3. public:
  4.         SOCKET m_Socket;
  5.         TCHAR m_szIpAddr[MAX_IP_LEN];
  6.         HANDLE m_hThread;

  7.         CClientItem()
  8.         {
  9.                 m_Socket = INVALID_SOCKET;
  10.                 ZeroMemory(m_szIpAddr, MAX_IP_LEN);
  11.                 m_hThread = NULL;
  12.         }
  13. };
复制代码

服务器端添加客户端的链表队列:
  1. CList <CClientItem*, CClientItem*> m_ClientList;
复制代码

=======================================================================================
③、        客户端处理线程:
  1. DWORD CServer::ClientThreadProc(LPVOID pParam)
  2. {
  3.         CClientItem *pClient = (CClientItem *)pParam;
  4.         while(TRUE) {
  5.                 if (SOCKET_Select(pClient->m_Socket)) {
  6.                         CMsgHead msg;
  7.                         int iRet = RecvData(pClient->m_Socket, (char *)&msg, sizeof(msg));
  8.                         if(iRet <= 0) {
  9.                                 AfxGetServer()->RemoveTargetClient(pClient);
  10.                                 return FALSE;
  11.                         }

  12.                         //recv ok;
  13.                         TCHAR *pszBuf = new TCHAR[msg.m_cntLen];
  14.                         ZeroMemory(pszBuf, msg.m_cntLen);
  15.                         iRet = RecvData(pClient->m_Socket, (char *)pszBuf, msg.m_cntLen);
  16.                         if(iRet <= 0) {
  17.                                 //recv body error
  18.                                 delete [] pszBuf;
  19.                                 AfxGetServer()->RemoveTargetClient(pClient);
  20.                         }

  21.                         AfxGetServer()->ProcessMsg(msg, pszBuf, pClient);
  22.                         delete [] pszBuf;
  23.                 }
  24.         }

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


===================================================
④、自定义协议讲解。

===================================================
※※※ 小作业:
①、提前预习网络通信中的自定义协议内容,本节课讲解。
------------------------------------- End -------------------------------------------

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





上一篇:VC++高级班之网络编程篇-[3]CServer类的封装
下一篇:VC++高级班之网络编程篇-[5]客户端连接及登陆

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

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

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

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

本版积分规则

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

GMT+8, 2018-12-11 22:48

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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