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

Internet 服務連接埠測試程式設計與實作

     編輯:關於C++

一、實用背景

上網用戶日增,常見問題多集中在 DNS、SMTP、POP3 設定上:該用哪個 DNS(202.96.0.133 還是 202.96.26.243)?ISP 郵件伺服器 IP 記不住(202.96.26.243 或 245)?下載檔案時面臨多鏡像站點選擇(如 Sunsite 數十個鏡像),哪個最快?

筆者開發應用程式 Tester,針對常用網路通訊連接埠(Web、Email、FTP 等)進行連線測試,取得服務狀態與回應時間指標,為有效使用 Internet 提供準確參考資料。Tester 也可作為簡單的 Internet 系統效能測試工具。雖涉及其他程式設計技巧,但總體屬於 Socket 應用程式。

二、Socket 程式設計模型

Socket 是網路通訊的端點。網路通訊指兩主機或兩進程透過網路傳遞資料,可視為一次「會話」。會話每一端即為網路通訊端點(通訊實體最小單位)。使用 Socket 介面程式設計時,Socket 為端點的抽象表示。多數採用客戶/伺服器模型,依端點工作性質區分通訊雙方:發起請求端為客戶端,回應請求端為伺服器端。

通訊雙方各需一個 Socket(客戶端 Socket、伺服器端 Socket),連線可為連線導向或無連線。Socket 介面沿用 UNIX I/O 概念,採 Open-Read-Write-Close 模式。主要步驟:

  1. 建立 Socket
  2. 設定 Socket
  3. 透過 Socket 發送資料
  4. 透過 Socket 接收資料
  5. 關閉 Socket

三、CSocket 程式設計模型 (MFC)

對初學者,直接使用 Socket 模型較複雜。Visual C++ MFC 提供封裝類別,概念簡單、程式設計容易。Tester 即使用 MFC Socket 相關類別實現。伺服器與客戶 Socket 建立通訊流程:

  1. 建立 CSocket 物件。
  2. 使用該物件產生 SOCKET 控制代碼。
  3. 客戶端:呼叫 CAsyncSocket::Connect 連線;伺服器端:呼叫 CAsyncSocket::Listen 監聽,收到請求呼叫 CAsyncSocket::Accept 接受處理。
  4. 建立 CSocketFile 物件並關聯 CSocket 物件。
  5. 建立 CArchive 物件實現資料卸裝(接收)與存儲(發送),需與 CSocketFile 關聯。
  6. 使用 CArchive 在雙向 Socket 間傳遞資料。單一 CArchive 僅能單向傳遞,通常需兩個實現雙向通訊。
  7. 解析 archive、socketfile、socket 物件。

四、程式實作

實作主要考慮三部分:Socket(網路通訊實體)、時鐘(測試回應時間)、介面(使用者互動)。

Socket(網路通訊實體)

Tester 作為客戶端 Socket 程式,包含 TestSocket (CSocket 衍生類)、TestSocketFile (CSocketFile 衍生類)、TestArchiveIn/TestArchiveOut (CArchive 衍生類)。物件建立與使用遵循前述 CSocket 模型。

時鐘(測試回應時間)

Tester 在 Socket 連線建立前後分別呼叫 clock() 系統函數,利用相對差值取得絕對時間參數(毫秒)。clock() 回傳處理器計時單位次數。核心程式碼:

clock_t start = clock();
if (m_pSocket->Connect(lpszAddress, nPort)) {
    clock_t end = clock();
    // 記錄成功連線時間
} else {
    clock_t end = clock();
    // 記錄失敗時間
}

記錄的回應時間包含處理器在整個網路通訊連線建立過程中的耗時,受網路狀況、伺服器回應時間、本地系統效能影響。實際用戶體驗的延遲即為上述因素總和。Tester 採 10 次測試平均值,屬綜合指標。

介面(使用者互動)

輸入部分

使用對話方塊物件 SetupDlg::CDialog,含 Check、Edit 等控制項,透過控制項傳遞使用者指定的測試資訊。

輸出部分

Tester 採單一文件介面 (SDI)。視窗樣式設定:

CEditView::PreCreateWindow(cs);
cs.style = AFX_WS_DEFAULT_VIEW | WS_VSCROLL
         | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE
         | ES_NOHIDESEL | ES_READONLY;

利用選單功能可將測試結果儲存為純文字檔。

五、應用範例

Tester 介面直觀、操作簡單:使用者填寫參數設定對話方塊,確認後自動測試並顯示結果,可儲存為文字檔。使用者可自訂服務連接埠測試(如對話方塊未列出的 Gopher),前提是知道目標服務的 Socket 連接埠號。以下為筆者經 2631 撥號上網測試的範例結果:

被測主機測試時間服務狀態回應時間
163.net10:37, June 09, 1998FTPOFF--
SMTPON2030 ms
DNSOFF--
POP3ON1050 ms
HTTPON380 ms
ihw.com.cn10:38, June 09, 1998FTPOFF--
SMTPON3670 ms
POP3ON720 ms
HTTPOFF--
www.yahoo.com10:38, June 09, 1998FTPOFF--
TELNETOFF--
SMTPOFF--
DNSOFF--
POP3OFF--
HTTPON1700 ms
www.microsoft.com10:39, June 09, 1998FTPOFF--
TELNETOFF--
SMTPOFF--
DNSOFF--
HTTPON930 ms
www.asia.microsoft.com10:39, June 09, 1998HTTPON650 ms
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved