<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++網絡編程(二)--客戶端服務器程序

      這是一個基于windows的,用C++編寫的客戶端服務器程序,適合初學者,高手誤入.源碼必共享

      思路是這樣的.啟動服務器,服務器啟動后會創建一個子線程,用于向客戶端發送信息.用一個死循環用于接收客戶端的請求,客戶端請求成功后,會將客戶端的連接保存到一個集合中,下面會詳細介紹這個保存客戶端連接的類.客戶端連接成功后,服務器會創建一個子線程用于接收客戶端的信息,客戶端同樣也會創建一個子線程接收服務器的信息.這樣客戶端和服務器就能進行通訊,如果有哪一方退出,另一方對應的接收數據的線程就會自動終止.

      退出一個客戶端后,服務器對應的接收數據的線程自動終止.如下圖:

      服務器保存客戶端連接的集合中會刪除對應的客戶端連接,由于這個刪除操作是在子線程中發生的,也就是說會有多個線程操作這個集合,那么針對這個集合的操作必須是線程安全的.保證線程安全的方法又很多,我的這篇博客《多線程編程--5種方法實現線程同步》介紹了5中方法實現線程同步,我這里用的是關鍵段,還有一點值得說明的是,保存客戶端連接的集合肯定只能有一份,我用一個類封裝了這個集合,這個類中的每個方法都是線程安全的,且只能有一個實例,這里用了比較暴力的方法,將相關的方法設為private,提供一個public的方法返回這個對象的一個靜態實例,唯一的一個實例。

      保存客戶端連接的類如下:

      //ClientList.h 存放客戶端的請求,只能有一個實例
      #ifndef _CLIENTLIST_H_
      #define _CLIENTLIST_H_
      #include <vector>
      #include "CSocket.h" 
      #include <assert.h>
      class CSocket;
      class ClientList
      {
      public : 
          typedef vector<CSocket*>::iterator Iter;
           
          void Add(CSocket* socket);
      
          int Count() const;
      
          CSocket* operator[](size_t index);
      
          void Remove(CSocket* socket);
      
          Iter Find(CSocket* socket); 
      
          void Clear(); 
      
          static ClientList* GetInstance()
          {
              static ClientList instance;
              return &instance;
          }
      
          ~ClientList();
      private:
          static CRITICAL_SECTION g_cs;
          static vector<CSocket*> _list; 
          ClientList(); 
          ClientList(const ClientList&);
          ClientList& operator=(const ClientList&); 
      };
       
      #endif
            
      #include "ClientList.h"
      typedef vector<CSocket*>::iterator Iter; 
      
      ClientList::ClientList()
      {
          InitializeCriticalSection(&g_cs);//初始化g_cs的成員 
      }
      
      ClientList::~ClientList()
      {
          DeleteCriticalSection(&g_cs);//刪除關鍵段 
      }
      
      void ClientList::Add(CSocket* socket)
      {
          if(socket!=NULL)
          {
              EnterCriticalSection(&g_cs);//進入關鍵段
              _list.push_back(socket);
              LeaveCriticalSection(&g_cs);//退出關鍵段  
          }
      }
      
      int ClientList::Count() const
      {
          return _list.size();
      }
      
      CSocket* ClientList::operator[](size_t index)
      { 
          assert(index>=0 && index<_list.size()); 
          return _list[index];
      }
      
      void ClientList::Remove(CSocket* socket)
      { 
          Iter iter=Find(socket);
          EnterCriticalSection(&g_cs);//進入關鍵段
          if(iter!=_list.end())
          { 
              delete *iter; 
              _list.erase(iter);
          }
          LeaveCriticalSection(&g_cs);//退出關鍵段  
      }
      
      Iter ClientList::Find(CSocket* socket)
      {
          EnterCriticalSection(&g_cs);//進入關鍵段
          Iter iter=_list.begin();
          while(iter!=_list.end())
          {
              if(*iter==socket)
              {
                  return iter;
              }
              iter++;
          }
          LeaveCriticalSection(&g_cs);//退出關鍵段  
          return iter;
      }
      
      void ClientList::Clear()
      {
          EnterCriticalSection(&g_cs);//進入關鍵段
          for(int i=_list.size()-1;i>=0;i--)
          {
              delete _list[i];
          }
          _list.clear();
          LeaveCriticalSection(&g_cs);//退出關鍵段  
      }
      
      CRITICAL_SECTION ClientList::g_cs;
      vector<CSocket*> ClientList::_list ;

      C++網絡編程(一)

      posted @ 2013-05-19 17:45  古文觀芷  閱讀(34520)  評論(9)    收藏  舉報
      主站蜘蛛池模板: 国产盗摄视频一区二区三区| 欧美黑人大战白嫩在线| 国产精品综合色区av| 蜜臀av久久国产午夜| 欧美xxxxhd高清| 国产综合视频一区二区三区| 欧美白妞大战非洲大炮| 老司机午夜福利视频| 精品午夜久久福利大片| 中国女人大白屁股ass| 老司机亚洲精品一区二区| 欧洲中文字幕国产精品| 少妇久久久久久久久久| av高清无码 在线播放| 四虎成人精品永久免费av| 亚洲最大有声小说AV网| 亚洲欧美人成电影在线观看| 99久久精品国产一区二区蜜芽| 成人深夜节目在线观看| 日韩 一区二区在线观看| 亚洲成av人片在www鸭子| 天堂国产一区二区三区| av无码一区二区大桥久未| 国产乱码精品一区二区三| 亚洲精品久久7777777国产 | 2020国产欧洲精品网站| 水蜜桃av导航| 亚洲人成线无码7777| 成人资源网亚洲精品在线| 这里只有精品在线播放| 日韩不卡在线观看视频不卡| 久久精品国产国产精品四凭| 4399理论片午午伦夜理片| 日韩亚洲精品中文字幕| 人妻内射一区二区在线视频| 欧美乱强伦xxxx孕妇| 国产一区二区日韩在线| 国产精品小视频一区二页| 99精品高清在线播放| 国产精品免费AⅤ片在线观看 | 亚洲综合伊人久久大杳蕉|