首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

基於 TCP/IP 的區域網路多使用者通訊系統實作 (四):伺服器多執行緒架構

     編輯:關於C語言

本文為系列第四部分,聚焦通訊伺服器的多執行緒設計與用戶端架構要點。

伺服器多執行緒模型

每個客戶端連線成功,伺服器建立兩條執行緒:

  • 接收執行緒:建立後處於可執行狀態,持續 recv 資料。
  • 發送執行緒:建立後阻塞等待喚醒,負責 send 轉發資料。

雙執行緒同步生成、同步結束。資料轉發邏輯簡化,但連線數受限於伺服器軟硬體能力。

執行緒同步:互斥量保護共享結構

定義 CMutex m_mutex,使用 Lock()/Unlock() 保護共享結構 info_data。

核心程式碼片段

接收執行緒

UINT RecvData(void* pParam) {
    SOCKET clientSocket = (SOCKET)pParam;
    while (true) {
        int nRcv = recv(clientSocket, buffer, MAXBUFLEN, 0);
        buffer[nRcv] = '\0';

        if (strcmp(buffer, "Close!") != 0) { // 非關閉指令
            // 尋找目標用戶 (依暱稱)
            POSITION pos = s_info.GetHeadPosition();
            while (pos) {
                USER_INFO info = s_info.GetNext(pos);
                if (info.petName == targetName) {
                    m_mutex.Lock();
                    info_data.data = buffer;
                    info_data.thread = info.pThread;
                    m_mutex.Unlock();
                    info.pThread->ResumeThread(); // 喚醒對應發送執行緒
                    break;
                }
            }
        } else { // 收到關閉指令
            // 清理用戶資訊、關閉連線、結束執行緒
            m_mutex.Lock();
            info_data.data = buffer;
            m_mutex.Unlock();
            pThread->ResumeThread();
            s_info.RemoveAt(pos);
            break;
        }
    }
    closesocket(clientSocket);
    AfxEndThread(0, true);
    return 1;
}

發送執行緒

UINT SendData(void* pParam) {
    SOCKET clientSocket = (SOCKET)pParam;
    while (true) {
        if (info_data.data != "Close!") {
            m_mutex.Lock();
            int nSnd = send(clientSocket, info_data.data, info_data.data.GetLength(), 0);
            CWinThread* pTargetThread = info_data.thread;
            m_mutex.Unlock();
            pTargetThread->SuspendThread(); // 自身掛起等待下次喚醒
        } else {
            break;
        }
    }
    closesocket(clientSocket);
    AfxEndThread(0, true);
    return 1;
}

用戶端架構要點

  • 無需多執行緒,網路連線技術成熟。
  • 重點在介面友好度與功能完善:通訊格式相容、操作簡易、美觀介面/熱鍵、資料準確收發、完整記錄/提取、多樣提醒 (托盤閃爍、聲音)。
  • 設計三個獨立對話框:註冊、登入、通訊。註冊/登入使用連接埠 56789,通訊使用 56790,實現業務隔離與負載分離。

系統驗證

已於實驗室區域網路 (1 台伺服器 + 20 台客戶端) 實測通過。

參考文獻

  1. Eugene Olafsen 等著. MFC Visual C++ 6.0 程式設計技術內幕. 機械工業出版社, 2000.
  2. Charles Wright. Visual C++ 程式設計師實用大全. 中國水利水電出版社, 2001.

作者:袁淵 (華東船舶工業學院 機械系)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved