程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Internet服務端口測試程序的設計與實現

Internet服務端口測試程序的設計與實現

編輯:關於C++

一、程序的實用背景

上網的朋友越來越多,遇到的問題也越來越多,最常見的就是關於域名服務器(DNS)、郵件服務(SMTP)和POP3的配置問題。例如,選用哪一個DNS,202.96.0.133還是202.96.26.243?記不清ISP的郵件服務器和域名服務器的IP地址,202.96.26.243還是245?

另外一個問題就是,我們在下載文件的時候,往往面臨從多個不同主機下載的選擇(象sunsite有數十個鏡像站點)。那麼,選擇哪一個站點進行下載是最快的呢?

筆者為此編寫了一個應用程序,試圖對Internet的常用的網絡通信端口(如Web、Email、FTP等)進行連接測試,獲得服務端口的狀態和響應時間指標,從而為我們更有效的使用Internet提供准確的參考數據。筆者為該程序命名為Tester(測試者),從後面敘述不難發現,Tester還可以作為簡單的Internet系統性能測試工具來使用。

雖然Tester也涉及了其它的編程方法,但就總體而言,Tester屬於Socket應用程序。所以我們先從Socket編程的模型入手,介紹Tester程序的設計與實現。

二、Socket編程模型

Socket是網絡通信的一個端點。我們知道,網絡通信通常指兩台主機或兩個進程,通過網絡傳遞它們之間的數據,這樣的過程可以理解為網絡的一次對話(Session)。網絡對話的每一端就成為網絡通信的端點,即網絡通信實體的最小單位。當使用Socket接口對網絡通信編程時,Socket是網絡通信過程中端點的抽象表示。大多數網絡通信采用客戶/服務器模型,客戶/服務器模型按照端點的工作性質來區分通信雙方的端點。例如,客戶/服務器模型將啟動網絡服務請求的端點視作客戶進程或客戶程序;對客戶請求作出響應的端點是服務器進程或服務器程序。

為了進行網絡通信,程序在網絡的對話的每一端都需要一個Socket,即客戶端的Socket和服務器端的Socket。兩個Socket之間的連接可以是面向連接的也可以是無連接的。雖然從目前看,Socket編程已經不再局限於UNIX系統,但是Socket接口在網絡通信時仍然使用UNIX系統I/O概念,Socket接口模型仍然采用Open-Read-Write-Close方式。Socket編程的包括幾個主要步驟:

1、建立Socket;

2、配置Socket;

3、通過Socket發送數據;

4、通過Socket接收數據;

5、關閉Socket。

三、CSocket編程模型

對於網絡通信編程的初學者來說,直接使用上述的socket模型會感覺困難和復雜。VisualC++的MFC(基礎類庫)提供了一些封裝好的對象可供使用,這些對象的概念相對簡單,編程相對容易。Tester程序就是使用MFC的幾個與socket相關的類來實現的。

在服務器Socket和客戶Socket之間建立通信的過程如下文所述。

1、創建CSocket對象。

2、使用該對象產生SOCKET句柄。

3、如果socket是客戶,調用CAsyncSocket::Connect,連接本地的Socket和服務器Socket;

如果socket是服務器,調用CAsyncSocket::Listen,開始偵聽從客戶端來的訪問請求,如果收到請求,調用CAsyncSocket::Accept進行接收處理。

4、建立CSocketFile對象,並且使該對象與CSocket對象具備一定的聯系;

5、建立CArchive對象,以便實現卸裝(接收)數據和存儲(發送)數據的目的。當然,該CArchive對象應該與前面的CSocketFile對象建立聯系;

6、使用CArchive對象在客戶和服務器socket之間傳遞數據,從而實現服務器socket和客戶機socket之間的通信。值得注意的是,一個給定的CArchive對象只能在單一的方向上傳遞數據:或者接收或者發送。一般情況下,可能需要兩個CArchive對象來實現數據的雙向傳遞。

7、解析archive、socketfile、socket對象。

四、程序的實現

簡單地講,對於程序的實現,筆者主要考慮了三部分的內容:Socket、時鐘以及界面。

Socket(網絡通信實體)

Tester作為一個客戶端的socket通信程序,包括TestSocket(Csocket派生類)、TestSocketFile(CSocketFile派生類)和TestArchiveIn、TestArchiveOut(CArchive派生類)等。這些對象的建立和使用與上述的CSocket編程模型相同。

時鐘(用於測試網絡上Internet服務端口的響應時間)

Tester在Socket連接建立的前後分別調用clock系統函數,從而可以利用二者的相對差別獲得絕對時間參數。clock函數可以獲得某一系統調用過程所耗費的時間。clock函數的返回值是處理器的計時單位次數。Tester的時間單位是毫秒。

...... //其它代碼

clock_tstart=clock();
if(m_pSocket->Connect(lpszAddress,nPort))
{
clock_tend=clock();
...... //其它代碼
}
else
{
clock_tend=clock();
...... //其它代碼
}

...... //其它程序段

從程序中可以看出,Tester記錄的響應時間,是指處理器在整個網絡通信的連接建立過程中的響應時間。這一結果和網絡狀況、服務器端的響應時間、本地系統的性能均有關系。實際上,網絡用戶在實際應用過程中真正的時間延遲,就是上述各個因素的總和。另外,Tester的響應時間結果是10次測試的平均數。所以,Tester測試的是整個網絡應用的響應時間,是綜合的指標。

界面(與程序使用者進行交互,指令的輸入和結果的輸出)

1、輸入部分

Tester使用了對話框對象:SetupDlg::CDialog,在對話框中,使用Check、Edit等控制件,並且通過這些控制向程序傳遞使用者所指示的測試信息。

2、輸出部分

Tester是單文檔界面(SDI)的應用程序。窗口風格見下面程序段:

......//其它代碼

CEditView::PreCreateWindow(cs);

cs.style=AFX_WS_DEFAULT_VIEW|WS_VSCROLL

|ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_MULTILINE

|ES_NOHIDESEL|ES_READONLY;

......//其它代碼

利用Tester的菜單功能可以把每次的測試結果存為純文本格式的文件。

五、程序的應用舉例

Tester對於熟悉Internet應用的使用者來說,界面一目了然,操作十分簡單。首先,使用者根據測試需要填寫參數設置對話框;確認後,由Tester程序自動執行測試工作,並將測試結果顯示於Tester窗口中。同時,用戶也可以將測試結果存為文本文件。

Tester的用戶可以自定義一些服務端口進行測試(例如,對話框中沒有列出的Gopher等Internet服務)。當然,在這種情況下,用戶必須知道被測試的服務的Socket端口號。

下面給出幾個測試結果文件,僅供參考(筆者經由2631撥號上網進行測試)。

被測主機:163.net

測試時間:10:37,June09,1998

Internet服務狀態響應時間(ms)

FTPOFF

SMTPON2030

DNSOFF

POP3ON1050

HTTPON380

被測主機:ihw.com.cn

測試時間:10:38,June09,1998

Internet服務狀態響應時間(ms)

FTPOFF

SMTPON3670

POP3ON720

HTTPOFF

被測主機:www.yahoo.com

測試時間:10:38,June09,1998

Internet服務狀態響應時間(ms)

--

FTPOFF

TELNETOFF

SMTPOFF

DNSOFF

POP3OFF

HTTPON1700

被測主機:www.microsoft.com

測試時間:10:39,June09,1998

Internet服務狀態響應時間(ms)

FTPOFF

TELNETOFF

SMTPOFF

DNSOFF

POP3OFF

HTTPON930

被測主機:www.asia.microsoft.com

測試時間:10:39,June09,1998

Internet服務狀態響應時間(ms)

--

HTTPON650

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