進程通信的概念最初來源于單機系統。由于每個進程都在自己的地址范圍內運行, 為保證兩個相互通信的進程之間既互不干擾又協調一致工作, 操作系統為進程通信提供了相應設施, 如UNIX BSD中的管道 (pipe) 、命名管道 (named pipe) 和軟中斷信號 (signal) 、UNIX system V的消息 (message) 、共享存儲區 (shared memory) 和信號量 (semaphore) 等, 但都僅限于用在本機進程之間通信。隨著科技的進步, 計算機的應用越來越廣泛, 計算機系統從當初的單機時代發展到現在的網絡時代, 各個應用系統之間、應用系統內部都需要一個協調過程, 這就需要各進程進行相互的通信。以便實現網絡之間批量數據的實時傳輸需求。VB中的Winsock控件恰到好處的解決了這一問題, 它提供了訪問TCP和UDP網絡服務非常簡便的途徑。
1 VB中的Winsock控件
Visual Basic (VB) 是Windows環境下簡單、易學、高效的一種編程語言, 尤其是其可視性、面向對象、較強的網絡通訊功能等特點使其成為首選的軟件開發工具。系統提供的Winsock控件, 提供了訪問TCP和UDP的網絡服務, 用于支持網絡中兩臺以上計算機之間的相互通信, 通過UDP協議 (用戶數據報協議) 或TCP協議 (數據傳輸協議) 連接到遠程的機器并進行數據交換。該控件封裝了繁瑣的技術細節, 只需通過設置控件的屬性和調用該控件的方法即可方便地連接到一臺遠程機器上進行雙向數據交換。
1.1 Winsock控件應用協議
Winsock控件主要是應用TCP和UDP協議。TCP是傳輸控制協議, 它提供了一種可靠的、面向會話連接的數據流服務, 協議通信時, 建立并控制數據發送方與接收方的會話關系。UDP用戶報文協議是一個無連接協議, 可以迅速地展開通信, 一般用于傳輸少量不重要的數據和信息。Winsock控件的UDP通信方式是一種廣播方式。
簡單的說, TCP協議控件是一個基于連接的協議, 就像電話機一樣, 用戶必須在通話之前建立連接;UDP是一個無連接的協議, 兩臺計算機之間的事務處理就像傳紙條一樣:一臺計算機向另一臺計算機發送消息, 但是它們之間并沒有一個明確的連接路徑。
1.2 Winsock控件應用屬性
Winsock控件在數據的遠程交換過程中主要利用以下幾個重要屬性。
(1) Index:標識控件數組中唯一的一個對象。 (2) Localport:返回或設置所用到的本地端口對客戶, 該屬性指定發送數據的本地端口。對于服務器, 這是用于監聽的本地端口。 (3) Remotehost:返回或設置遠程計算機, 控件向其發送數據或從其接收數據。 (4) Remoteport:返回或設置要連接的遠程端口號。
1.3 Winsock控件應用方法
Winsock控件在數據的遠程交換過程中應用以下重要方法: (1) Accept:在處理ConnectionRequest事件時使用該方法接受新連接請求; (2) Bind:指定用于TCP連接的LocalPort和LocalIp, 且在調用Listen方法之前必須調用Binde方法; (3) GetData:獲取當前的數據塊并將其保存在一個Variant類型的變量中; (4) Listen:創建套接字并將其設置為監聽模式; (5) SendData:發送數據到遠程計算機。
1.4 典型的T C P協議雙向通訊的過程
使用TCP協議通信時, TCP建立并控制數據發送方與接收方的會話關系, 當接收方正確收到數據后, 必須向發送方發送確認信息。如果發送方在指定時間內未能收到確認信息, 將重發數據包, 一般包括如下步驟: (1) 獲得對方的IP地址和端口號; (2) 在本地主機上選擇一個IP地址和端口; (3) 在通訊雙方之間建立socket連接; (4) 傳輸數據; (5) 傳輸完畢后斷開連接。
2 Winsock控件網間數據通訊實現方案
(1) 服務器程序必須設置好LocalPort屬性, 作為偵聽端口, 該值為一個整數 (只要是一個其它TCP/IP應用程序沒有使用過的值即可) 。例如:Winsock1.Local Port=local_port (local_port為端口變量) 。 (2) 使用Listen方法進入偵聽狀態, 等待客戶機程序的連接請求。
Winsock1.Bind local_port
Winsock1.Listen
(3) 客戶機程序發出連接請求, 使服務器程序產生ConnectionRequest事件, 該事件得到一個參數requestID。 (4) 服務器程序用Accept方法接受客戶機程序的requestID請求。這樣, 服務器程序就可以用SendData方法發送數據了。Accept方法必須用上一步得到的requestID作為其參數。
在Winsock1的ConnectionRequest事件中, 調用另外一個Winsock2控件去accept這個requestID, 主要是讓Winsock2去與對方發生真正的通訊, Winsock1控件需要繼續它的偵聽工作, 只有這樣, 另外的客戶端才可以繼續socket的連接, 這樣可以起到一個服務端對多個客戶端的服務。
(5) 當服務器程序接收到數據時, 產生DataArrival事件, 參數BytesTotal包含接收到的數據字節數。在該事件中, 可以用GetData方法接收數據。
(6) 如果接受到Close事件, 則用Close方法關閉TCP/IP連接。
3 結語
本文通過對VB中的WinSock控件特性與功能應用分析, 給出了基于該控件的實現數據傳輸與通訊的具體實現方案。利用此方法, 可以方便的解決網間數據傳送提高開發效率, 具有廣泛的適用性和實用價值。
摘要:網間數據通信要解決的是不同主機進程間的相互通信問題。在這個過程中, 一方是作為服務端模式;另一方是作為客戶端模式去訪問服務端。本文就如何利用VB中的WinSock控件的數據通訊功能, 建立遠程計算機連接并進行雙向數據交換提供可靠實現方案。
關鍵詞:端口,地址,Winsock控件,進程