摘要 本文闡述了開發Windows Sockets通訊程 序的軟、硬體環境,基本步驟和技術要點,並以在Windows 95環境下,用Visual C++ 4.0編程為例 ,進一步闡述了開發Windows Soc-kets通訊程式的經驗與實踐。
關鍵詞 通訊端 Windows Sockets 電腦網路 通訊
一、引言
通訊端(Socket)最初是由加利福尼亞大學Berkeley分校為UNIX作業系統開發的網路通訊介面,隨著UNIX作業系統的廣泛使用,通訊端成為當前最流行的網路通訊應用程式介面之一。90年代初,由Sun Microsystems,JSB Corporation,FTP software,Microdyne和Microsoft等幾家公司共同制定了一套標準,即Windows Sockets規範。
Windows Sockets API是Microsoft Windows的網路程式設計介面,它在繼承了Berkeley Sockets主要特徵的基礎上,又對它進行了重要擴充。這些擴充主要是提供了一些非同步函數,並增加了符合Windows訊息驅動特性的網路事件非同步選擇機制 。這些擴充有利於應用程式開發人員編製符合Windows編程模式的軟體,它使在Windows下開發高效能的網路通訊程式成為可能。
Socket實際上是指一個通訊端點,藉助於它,使用者所開發的Socket應用程式,可以通過網路與其它Socket應用程式進行通訊。
近年來,隨著電腦網路與Windows 95的流行,許多使用者所開發的應用程式需要實現網路間的資料通訊,在此,筆者根據在Windows 95環境下,利用Visual C++ 4.0進行Windows Sockets應用程式的開發經驗,闡述一下有關網路間資料通訊程式的開發內容。
二、開發Windows Sockets網路通訊程式的軟、硬體環境
所採用的作業系統軟體可以是Windows 95,也可以是Windows NT,因為它們都支援Windows Sockets API,在以下的介紹中,我們將以在Windows 95環境下的開發為例。
所採用的程式設計語言一般可選目前較流行使用的可視化和採用物件導向技術的Microsoft Visual C++ 4.0。Visual C++ 4.0可在Windows 95或Windows NT環境下運行,其開發系統增加了全面整合的基於Windows 的開發工具以及一個基於傳統C/C++開發過程的“可視化”使用者介面驅動模型。Visual C++ 4.0中的Microsoft基類(MFC,即Microsoft Foundation Class)庫是一系列C++類,其中封裝著為Microsoft Windows作業系統系列編寫應用程式的各種功能 。在有關通訊端方面,Visual C++ 4.0對原來的Windows Sockets庫函數進行了一系列封裝,繼而產生了CSocket 、CSocketFile等類,它們封裝著有關Socket的各種功能。
所採用的網路通訊協定一般是TCP / IP。Windows 95和Windows NT都帶有該協議。但是,所開發的網路通訊應用程式並不能直接與TCP / IP核心打交道,而是與網路應用編程介面Windows Sockets API打交道。Windows Sockets API則可直接與TCP/IP核心進行溝通。TCP / IP核心協議連同網路物理介質(如網卡)一起,都是提供網路應用程式間相互連信的設施。其關係1所示。
網路通訊應用程式
Windows Sockets API
TCP / IP核心協議
物理介質
圖1 TCP / IP協議核心與網路通訊應用程式圖表
在採用TCP / IP網路通訊協定的應用中,各網路節點電腦之上的Windows Sockets網路通訊程式之間相互作用的主要模式為客戶 / 伺服器(Client / Server ) 模式。即客戶向伺服器發出服務要求,伺服器接收到請求後,提供相應的服務。採用這種模式的網路應用程式在進行通訊時,伺服器方的網路應用程式需首先啟動,並開啟一通訊通道告知本地主機,它可以在某一公認地址上(保留連接埠,如檔案傳送協議FTP為21)接收客戶請求。而客戶方的網路應用程式隨後啟動,並開啟一通訊通道,串連到伺服器所在主機的保留連接埠。
圖2是客戶方的PC機1、PC機2和PC機3上的Windows Sockets通訊程式,與伺服器方的PC機0上的Windows Sockets通訊程式,採用客戶 / 伺服器模式進行通訊的典型拓撲結構。
PC機0
乙太網路交換器或集線器
PC機1 PC機2 PC機3
圖2 採用客戶/ 伺服器模式相互作用的Windows Sockets通訊程式
所採用的典型網路拓撲結構
網路中的所採用的電腦應滿足Windows 95啟動並執行配置要求。如果有條件,最好採用Pentium或其以上檔次的微機,將記憶體配置到16MB,並採用1GB左右的硬碟。
網路中各節點上的電腦需安裝網卡,並通過Windows 95或其它途徑安裝上該網卡的驅動程式。此外,象圖2那樣的網路若採用乙太網路交換器(SWITCH),需購買一台帶有一個100Mbps連接埠和數個10Mbps連接埠的乙太網路交換器,如3COM公司的 SWITCH 1000 ,並通過5類線(UTP)將各電腦上的網卡串連入交換器中相應的連接埠,即:將帶有100Mbps乙太網路卡的PC 0接入100Mbps連接埠,將其它各電腦接入3個10Mbps連接埠。
在配置網路時,首先應通過Windows 95控制台中的網路設定項及Windows 95資源管理員中檔案屬性共用性的設定,使各電腦節點能在“網路位置”中找到自己和其它各電腦,並能實現檔案資源相互共用。有關這方面內容介紹的文章已有不少,在此筆者不再贅述。
要實現Windows Sockets應用程式在網上的資料通訊,僅僅達到檔案資源相互共用還不夠,還必須在Windows 95控制台中的網路設定項添加上TCP / IP協議,同時給定相應的IP地址,這些IP地址在所建的區域網路中,不能有重複。象圖2中的網路,一般要採用C類地址。
以圖2網路為例,在對TCP / IP的屬性進行設定的對話方塊中,在“IP地址”一項可選“指定IP地址” ,在將“子網屏蔽”都設定為255.255.0.0的情況下 ,PC機 0、PC 機1、PC 機2、PC機3各電腦的IP地址可依此設定為166.166.100.101,166.166.100.102,166.166.100.103,166.166.100.104。
三、進行Windows Sockets通訊程式開發的基本步驟
Windows Sockets支援兩種類型的通訊端,即流式通訊端(SOCK_STREAM)、和資料通訊端(SOCK_DGRAM)。對於要求精確傳輸資料的Windows Sockets通訊程式,一般採用流式通訊端。流式通訊端提供了一個連線導向的、可靠的、資料無錯的、無重複發送的及按發送順序接收資料的服務。其內設流量控制,避免資料流超限,同時,資料被看作是位元組流,無長度限制。採用流式通訊端的應用程式的開發都有其基本步驟,圖3是伺服器方及客戶方通訊程式的基本流程及作用關係。
伺服器方 客戶機方
建立流式通訊端
s1=socket(......)
將本地地址與s1相連
bind(s1, ..... )
監聽來自客戶方的串連
listen(s1, .....)
建立流式通訊端
s=socket(........)
接收串連,並得到
新的通訊端s2
s2=accept(s1, ....)
將通訊端s與伺服器
建立串連 方主機串連
connect(s, .......)
在通訊端s2上,
讀/ 寫資料,直至 在通訊端s上寫/讀資料,
資料交換完 直到資料交換完
recv(s2, .....) 資料轉送 send(s, .....)
send(s2, .....) recv(s, .....)
關閉通訊端s2 關閉通訊端s
closesocket ( s2 ) closesocket( s )
關閉通訊端s1
closesocket(s1)
圖3 伺服器及客戶機方通訊程式基本流程及作用關係
儘管Visual C++ 4.0對原來的Windows Sockets庫函數進行了一系列封裝,但利用Visual C++ 4.0進行Windows Sockets應用程式開發,其基本流程及作用關係仍然同圖3類似。以在Visual C++ 4.0中,經常結合使用CSocket、CSocketFile、CArchive等類開發通訊程式的方法為例,闡述其基本步驟,4所示。
伺服器方(SERVER) 客戶方(CLIENT)
1、構造一個通訊端 1、構造一個通訊端
CSocket ser_s1; CSocket cli_s;
2、建立該通訊端 2、建立該通訊端
ser_s1.Create (port) ; cli_s.Create ( ) ;
其中,port為伺服器方開啟
的通訊通道號
3、開始監聽來自客戶機的串連
ser_s1.Listen( );
3、客戶機方通訊端cli_s向伺服器方
通訊端ser_s1發出串連請求
cli_s .Connect (Addr,port);
(其中,Addr是欲串連伺服器方
通訊端地址結構指標,可採用IP地
址或機器名。port即開啟的通道號,
其值與伺服器方的一致。)
4、構造一個新的通訊端
Csocket ser_s2 ;
5、伺服器等待從ser_s2上
接受客戶串連請求
ser_s1.Accept (ser_s2) ;
6、構造一個類CSocketFile的對象 4、構造一個類CSocketFile的對象
CSocketFile file(&ser_s2) ; CSocketFile file(&cli_s) ;
7、構造類CArchive的對象arIn、arOut 5、構造類CArchive的對象arIn、arOut
,以用於資料的收和發。 ,以用於資料的收和發。
CArchive arIn(&file , CArchive ::load) ; CArchive arIn(&file , CArchive ::load) ;
CArchive arOut(&file , CArchive ::store) ;CArchive arOut(&file , CArchive ::store) ;
8、使用arIn和 arOut 進行收或發資料 6、使用arIn和 arOut 進行發或收資料
arIn >> value ; arOut << value ;
arOut << value ; arIn >> value ;
其中,value是所傳輸的資料
9、摧毀所建立的CSocket、 7、摧毀所建立的CSocket、
CSocketFile 、CArchive 等類的對象 CSocketFile 、CArchive 等類的對象
圖4 使用Visual C++ 4.0進行Windows Sockets應用程式開發的基本步驟
四、使用Visual C++ 4.0進行Windows Sockets程式開發的其
它技術要點
針對使用Visual C++ 4.0進行Windows Sockets應用程式開發,需要注意以下幾點:
1、 同常規編程一樣,無論伺服器方還是客戶方應用程式都要進行所謂的初始化處理,4中Addr、port預設值的設定等,這部分工作仍可採用訊息驅動機制來先期完成。
2、一般情況下,網路通訊程式是某應用程式中的一模組。在單獨調試網路通訊程式時,要盡量與採用該通訊模組的其它應用程式開發人員約定好,統一採用一種介面形式,即單一文件介面SDI、多重文件介面MDI和基於對話方塊介面中的一種(這在使用AppWizard形成項目[Project]檔案時有提示),儘管這並非必須,但可使通訊模組在移植到所需的應用程式時省時省力,因為Visual C++ 4.0這種可視化語言在給我們提供方便的同時,也給我們帶來某些不便,譬如所形成的專案檔中的許多相關檔案與所採用的介面形式密切聯絡,許多訊息驅動功能,隨所採用的介面形式不同而各異。
當然,也可將通訊模組函數化,並形成一個動態串連庫檔案(DLL檔案),供主程式調用。
3、以通訊程式作為其中一個模組的應用程式往往不是在等待資料發送或接收完之後再做其它工作,因而在主程式中要採用多線程(Multithreaded)技術。即將資料的發或收,放在一個具有一定優先順序(一般宜取較高優先順序)的輔助線程中,在資料發或收期間,主程式仍可進行其它工作,譬如利用上一個周期收到的資料繪製曲線 。Visual C++ 4.0中的MFC提供了許多有關啟動線程、管理線程、同步化線程、終止線程等功能函數。
4、在許多情況下,要求通訊模組應即時地收、發資料。譬如調用之的主程式以0.5秒為一周期,在這段時間內 ,要進行如下工作:接收資料,利用收到的資料進行運算,將運算結果發送到其它電腦節點,周而復始。我們在充分利用Windows Sockets的基於訊息的網路事件非同步選擇機制,用訊息來驅動資料的發送和接收的基礎上,結合使用其他措施,如將資料的收和發放在高優先順序線程,在軟體設計上,安排好時序,盡量避免在同一時間內,雙方都在向對方發送大量資料的情況發生,保證網路要有足夠的頻寬等,成功地實現了資料轉送的即時性。
主要參考文獻:
1、蔣東興 林鄂華 編著,Windows Sockets網路程式設計指南
清華大學出版社 1996年9月
2、胡道元主編,資訊網路系統整合技術
清華大學出版社 1996年3月
3、Microsoft公司,Visual C++ 4.0教程
4、Visual C++ 4.0軟體上的線上協助
文中部分英文字詞辨析:
Berkeley、Sun Microsystems、JSB Corporation、FTP software、Microdyne、Microsoft、AppWizard、Multithreaded