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

C/S 架構線上考試系統完整解析:IOCP 伺服器 + Win32 API 客戶端 + ODBC 資料庫

     編輯:關於VC++

系統架構概覽

層級技術棧關鍵特性
伺服器Win32 IOCP (I/O Completion Ports) + 多執行緒 + ODBC API高併發、線性擴展 (CPU 核心數 × 2 + 2 執行緒池)
客戶端純 Win32 API (無 MFC) + 動態記憶體佈局800×600 / 1024×768 自適應、試卷動態分頁、倒計時同步
資料庫ODBC 連線 (SQL Server / Access 等)試卷、題目、作答、成績集中管理

伺服器:IOCP 完成埠模型

為什麼選 IOCP?

  • 唯一能線性擴展至千萬連線的 Windows 網路模型
  • 執行緒數固定 (CPU核心數 × 2 + 2),無上下文切換風暴
  • 核心物件 CreateIoCompletionPort 綁定 Socket + 檔案控制代碼

執行緒模型示意


[Accept 執行緒] → accept() → CreateIoCompletionPort(socket, hIOCP, CompletionKey, 0)
                                    ↓
[Worker 執行緒池 (N=CPU*2+2)] ← GetQueuedCompletionStatus(hIOCP, ...)
                                    ↓
                        處理 Overlapped I/O 完成事件
                                    ↓
                        邏輯處理 (登入/試卷/作答/成績)
                                    ↓
                        PostQueuedCompletionStatus (如需後續非同步操作)

IOCP 執行緒模型示意圖

客戶端:純 Win32 API 動態 UI

視窗建立

  • CreateWindowEx 建立主視窗、Static/Edit/Button/ScrollBar 等標準控制項
  • 所有座標由 GetClientRect 計算相對位置,支援雙解析度自適應

試卷資料結構 (動態配置)


// 題目結構
struct Question {
    BOOL state;          // 作答狀態
    char Text[512];      // 題幹
};
struct Option {
    BOOL state;
    char Text[256];
};
struct TestItem {
    Question Title;
    Option Choose[4];
};

// 動態配置
TestItem* g_pTestPaper = NULL;
int g_nQuestionNum = 0;

// 畫面行緩衝 (處理自動換行)
struct Line {
    int earmark;      // 對應按鈕 ID
    BOOL color1, color2;
    char Text[512];
};
Line* g_pScreenLines = NULL;
int g_nTotalLines = 0;

初始化流程

  1. 登入驗證成功 → 伺服器回傳考試倒計時秒數
  2. 發送 GetNum 取得總題數 → new TestItem[n]
  3. 發送 GetQue 逐題取得內容 → 填充 g_pTestPaper
  4. 預排版:模擬 TextOut 寬度計算,將長行拆分,產生 g_pScreenLines
  5. 建立按鈕陣列:HWND* g_hBtns = new HWND[n*4],ID = 題號*10 + 選項

換行演算法與中英文混排修正


int nLineWidth = clientWidth / charWidth; // 偶數
int nHanChar = 0; // 雙位元組字元計數
for (each char in text) {
    if (IsDBCSLeadByte(c)) nHanChar++; // 簡易判斷漢字
    // ... 累加寬度
    if (exceeds lineWidth) {
        if (nHanChar % 2 == 1) lineWidth--; // 避免漢字被切半
        // 換行邏輯
        nHanChar = 0;
    }
}

繪製與互動

  • WM_PAINT:遍歷 g_pScreenLines 呼叫 TextOut,依 earmark 顯示/隱藏對應單選按鈕
  • WM_COMMAND (按鈕點擊):解析 ID → 更新 g_pTestPaper 狀態 → InvalidateRect 重繪
  • 定時器 (1秒):倒計時遞減,歸零自動交卷
  • 定時器 (10秒):自動儲存作答進度 (防死機)

通訊協議 (自定義文字指令)


login:username,subject,password     → 登入驗證
Srecv:ScanTm                        → 取得伺服器時間/倒計時
Srecv:GetSta                        → 取得試卷狀態
Srecv:GetRlt                        → 取得上次作答 (斷點續作)
Srecv:GetNum                        → 取得總題數/時間
Srecv:GetQue                        → 取得題目內容
Srecv:SaveDt                        → 儲存作答
Srecv:ChanST                        → 修改試卷狀態 (鎖定/交卷)

執行畫面

客戶端介面結構 試卷顯示效果

測試帳號

  • 帳號:姚明
  • 密碼:1981922
  • 資料庫需預設:試卷狀態=1、開考/結束時間已設定

總結與啟示

  • IOCP 是高併發 Windows 伺服器的黃金標準
  • 純 Win32 API 客戶端雖開發量大,但體積小、無 MFC 依賴、部署極簡
  • 動態記憶體 + 相對座標佈局是解決多解析度、可變內容 UI 的通用模式
  • 伺服器授時 + 客戶端本地倒計時,有效防止客戶端竄改系統時間作弊

完整原始碼 (伺服器/客戶端/資料庫腳本) 請參考本文配套下載。此專案為大型作業答辯作品,展示了從網路模型到 UI 繪製的全棧實作能力。

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