程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++網絡編程(二)--客戶端服務器程序

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

編輯:C++入門知識

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

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

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

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

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

 _CLIENTLIST_H_<vector><assert.h>
<CSocket*> Add(CSocket* Count() *  Remove(CSocket** ClientList* &~ vector<CSocket*> ClientList&& =( ClientList&
      
#include <CSocket*>&g_cs);
~&g_cs);
 ClientList::Add(CSocket*(socket!=&g_cs);
&g_cs);
 ClientList::Count() * ClientList::>= && index< ClientList::Remove(CSocket*=&g_cs);
    (iter!=*&g_cs);
*&g_cs);
    Iter iter=(iter!=(*iter==++&g_cs);
    &g_cs);
    ( i=_list.size()-;i>=;i--&g_cs);
<CSocket*> ClientList::_list ;

C++網絡編程(一)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved