上網用戶日增,常見問題多集中在 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 介面沿用 UNIX I/O 概念,採 Open-Read-Write-Close 模式。主要步驟:
對初學者,直接使用 Socket 模型較複雜。Visual C++ MFC 提供封裝類別,概念簡單、程式設計容易。Tester 即使用 MFC Socket 相關類別實現。伺服器與客戶 Socket 建立通訊流程:
CSocket 物件。SOCKET 控制代碼。CAsyncSocket::Connect 連線;伺服器端:呼叫 CAsyncSocket::Listen 監聽,收到請求呼叫 CAsyncSocket::Accept 接受處理。CSocketFile 物件並關聯 CSocket 物件。CArchive 物件實現資料卸裝(接收)與存儲(發送),需與 CSocketFile 關聯。CArchive 在雙向 Socket 間傳遞資料。單一 CArchive 僅能單向傳遞,通常需兩個實現雙向通訊。archive、socketfile、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.net | 10:37, June 09, 1998 | FTP | OFF | -- |
| SMTP | ON | 2030 ms | ||
| DNS | OFF | -- | ||
| POP3 | ON | 1050 ms | ||
| HTTP | ON | 380 ms | ||
| ihw.com.cn | 10:38, June 09, 1998 | FTP | OFF | -- |
| SMTP | ON | 3670 ms | ||
| POP3 | ON | 720 ms | ||
| HTTP | OFF | -- | ||
| www.yahoo.com | 10:38, June 09, 1998 | FTP | OFF | -- |
| TELNET | OFF | -- | ||
| SMTP | OFF | -- | ||
| DNS | OFF | -- | ||
| POP3 | OFF | -- | ||
| HTTP | ON | 1700 ms | ||
| www.microsoft.com | 10:39, June 09, 1998 | FTP | OFF | -- |
| TELNET | OFF | -- | ||
| SMTP | OFF | -- | ||
| DNS | OFF | -- | ||
| HTTP | ON | 930 ms | ||
| www.asia.microsoft.com | 10:39, June 09, 1998 | HTTP | ON | 650 ms |