VC++環(huán)境下基于WinSock的網(wǎng)絡通信
出處:MicroMMU 發(fā)布于:2011-05-30 18:04:47
引言
隨著Internet的迅猛發(fā)展,網(wǎng)絡通信應用程序的開發(fā)成為研究熱點。Windows環(huán)境下進行通訊程序設計的基本方法是應用Windows Sockets實現(xiàn)進程間通訊。
1 TCP/IP協(xié)議、應用程序與套接字
TCP/IP協(xié)議是眾多網(wǎng)絡協(xié)議中比較完善的一種,它的部分是傳輸層協(xié)議(TCP,UDP)、網(wǎng)絡協(xié)議層(IP)和物理接口層。 這三層通常在操作系統(tǒng)內(nèi)核中實現(xiàn)。操作系統(tǒng)的內(nèi)核是不能為用戶所感受到的,一般用戶感受到的只有應用程序。應用程序通過程序界面與操作系統(tǒng)內(nèi)核打交道。TCP/IP網(wǎng)絡環(huán)境下的應用程序是通過網(wǎng)絡系統(tǒng)編程界面套接字Socket(在Windows操作系統(tǒng)下稱之為WiNSock)來實現(xiàn)的。Socket構成了協(xié)議的用戶視圖。通過Socket,應用程序可訪問通信協(xié)議。TPC/IP協(xié)議與應用程序之間的關系如圖1.

圖1 應用程序與Windows Sockets的關系
套接字(Socket)是網(wǎng)絡通信的基本構件。套接字是可以被命名的通信端點,應用程序通過它在網(wǎng)絡上發(fā)送和接收數(shù)據(jù)。每個套接字都有其類型,并有一個與之相連的進程。TCP/IP提供3種類型套接字:
1.1 流式套接字(SOCK—STREAM)
該接口提供一個面向連接、可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯、無重復地發(fā)送,且按發(fā)送順序接收。 內(nèi)設流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作字節(jié)流,無長度限制。流式套接字提供了一種可靠的面向連接的數(shù)據(jù)傳輸方式,如果想發(fā)送大批量數(shù)據(jù)或想讓數(shù)據(jù)按順序無重復地到達目的地,流式套接字為有用。本文使用流式套接字。
1.2 數(shù)據(jù)包套接字(SOCK—DGRAM)
該接口提供一個無連接服務。數(shù)據(jù)包以獨立包形式被發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復,并且接收順序混亂。數(shù)據(jù)包套接字比較適用于數(shù)據(jù)包或記錄型數(shù)據(jù)的傳輸,數(shù)據(jù)包的發(fā)送不能得到保證,而且不能排序到達。
1.3 原始式套接字(SOCK—RAW)
該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。
套接字至少在客戶機/服務器模式;點對點模式;遠程程序調(diào)用(RPc)三種通信環(huán)境下廣泛應用。
2 Windows Sockets介紹
Sockets初只是UNIX系統(tǒng)中的網(wǎng)絡通信接口之一。1992年制定出Windows Sockets規(guī)范1.0版。 目前實際應用中的Windows Sockets規(guī)范主要有1.1版和2.0版,其中1.1版只支持TCP/IP協(xié)議,而2.0版支持多協(xié)議,并具有良好的向后兼容性。 Windows Sockets 是MicrosoftWindows的網(wǎng)絡程序設計接口,使在Windows下開發(fā)高性能的網(wǎng)絡程序成為可能。
Windows Sockets實現(xiàn)一般由兩部分組成:開發(fā)組件和運行組件。 開發(fā)組件包括介紹WindowsSockets實現(xiàn)的文檔、Windows Sockets應用程序接口(API)引入庫和一些頭文件。 運行組件是Windows Sockets應用程序接口的動態(tài)鏈接庫(DLL),文件名為WINSOCK.DLL,應用程序在執(zhí)行時通過裝入它實現(xiàn)網(wǎng)絡通信功能。
Windows Sockets是Berkelery Sockets 在Windows環(huán)境下的擴充[5],它為Windows下網(wǎng)絡異步通信提供了一種方便的開發(fā)和運行環(huán)境,現(xiàn)在已經(jīng)成為Windows標準下的網(wǎng)絡程序設計接口,Windows下各種開發(fā)平臺都支持Windows Sockets上的網(wǎng)絡程序設計,提供了網(wǎng)絡編程接口。
Windows Sockets API是Windows Sockets的網(wǎng)絡程序接口,它包括一個標準的BerkelerySockets功能調(diào)用*,以及為Windows所作的擴充功能。 擴充功能的調(diào)用都冠以WSA(windowssockets asnchronous)前綴,表明它們都允許異步的I/O操作,并采用符合Windows消息機制的網(wǎng)絡事件異步選擇機制。這些擴充功能有利于開發(fā)者更好地利用Windows的消息驅動特性來設計出高性能的網(wǎng)絡程序。
3 網(wǎng)絡通信的實現(xiàn)
通過一個客戶機/服務器模式的網(wǎng)絡應用程序,實現(xiàn)對CSocket類的派生和應用為例介紹網(wǎng)絡通信的實現(xiàn)。
3.1 客戶機/服務器模式
數(shù)據(jù)集中管理需要融合各控制系統(tǒng)的不同數(shù)據(jù),由于各控制系統(tǒng)連接在不同的網(wǎng)絡上,要融合其中的實時信息需要解決異種網(wǎng)聯(lián)的問題,而TCP/IP協(xié)議無疑是一個很好的選擇。
對于各集中監(jiān)測系統(tǒng),與數(shù)據(jù)集中管理系統(tǒng)同在中央調(diào)度室,因此可以在遵循TCP/IP協(xié)議的局域網(wǎng)中進行實時通信。 在TCP/IP協(xié)議下利用Socket進行網(wǎng)絡編程,自然就會涉及到C/S(客戶機/服務器)模式,即客戶端向服務器發(fā)出請求,服務器接收到請求后提供相應的服務??蛻魴C/服務器模式在操作過程中采取的是主動請求方式。
3.1.1 服務器方
首先服務器方要啟動,偵聽客戶方是否有連接請求,并根據(jù)請求提供相應服務:
1)打開一通信通道并告知本地主機,它愿意在某一公認地址端口上接受客戶請求,或者由開發(fā)人員自己指定端口地址;
2)等待客戶請求到達該端口;
3)接收到重復服務請求時,處理該請求并發(fā)送應答信號。接收并發(fā)送服務請求,需要激活一個新進程來處理這個客戶請求,并不需要對其他請求作出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止;
4)返回第二步,等待另外的客戶請求;
5)關閉服務器。
3.1.2 客戶方
1)打開一通信通道,并連接到服務器所在的主機的特定端口;
2)向服務器發(fā)出服務請求報文,等待并接收應答,繼續(xù)提出請求;
3)請求結束后關閉通信通道并終止。
從以上描述過程可以看出:客戶機與服務器進程的作用是非對稱的,因此編碼不同,而且服務進程要先于客戶請求啟動?;诿嫦蜻B接的Socket的客戶機/N務器應用程序基本結構如圖2.

圖2 面向連接的套接字應用程序的時序
3.2 用Winsock進行網(wǎng)絡編程
為了簡化WinSock網(wǎng)絡編程,使用戶專注于應用程序算法的設計,Microsoft的基本類庫(microsoft foundation class或MFC)提供了兩種利用Windows Sockets進行網(wǎng)絡通信的編程模式,這兩種模式即為用CAsyncSocket類和派生于CAsyncSocket的CSocket類 來編程。這兩個類在不同程度上對WinSock API的函數(shù)進行了封裝,在編程時使用經(jīng)過封裝的MFC WinSock類使編程工作大大簡化,而且,這兩個類都提供了事件處理函數(shù),通過對事件處理函數(shù)進行重載,用戶可以在應用程序中很方便地對套接字發(fā)送、接收數(shù)據(jù)等事件進行處理。
CAsyncSocket類封裝了Windows SocketsAPI函數(shù),提供了較低層的與Windows Sockets對話接口,一般適合于有相當水平的網(wǎng)絡編程基礎者使用,可方便地進行底層的網(wǎng)絡事件通知及信息回叫控制等操作。
3.2.1 程序設計思想
雖然MFC本身提供了CSocket類用于實現(xiàn)客戶機與服務器之間的通信,但是為了增強程序的可 客戶端也建立一個類CSocketClient用于與服擴展性和提高性能,在服務器端建立了 務器端通信,也繼承自CSocket類。
ClisteningSocket類用于協(xié)議端口,通過對 CSocket類的listen()函數(shù)重載使得當客戶端提出連接請求時,可以做出應答,同時建立了客戶端類CClientSocket,它繼承自CSocket類,通過重載Accept()函數(shù)與客戶端建立連接,用于處理服務器客戶端數(shù)據(jù)的發(fā)送和接收。
3.2.2 程序實現(xiàn)
服務器端Socket程序是在CSocketServer類中實現(xiàn)的,數(shù)據(jù)的接收和處理都是在這個類中實現(xiàn)的。
主要步驟如下:
1)服務器端創(chuàng)建Socket以及客戶端創(chuàng)建Socke
在類ClisteningSocket中創(chuàng)建端口,一旦有數(shù)據(jù)到達它將通知Socket,實現(xiàn)如下:

2)客戶端與服務器端的連接
當listen()函數(shù)到有客戶端程序建立連接時,服務器端就新建一個CClientSocket用于與客戶端進行數(shù)據(jù)交換傳輸,并把它鏈到鏈表的尾部,需要進行數(shù)據(jù)傳輸時通過鏈表進行連接,這樣就可以實現(xiàn)一個服務器與多個客戶端的連接,然后通過重載CSocket類的OnAccept()函數(shù)進行處理。服務器端程序如下:

當客戶端需要與服務器通信時,客戶端指定端口和服務器名,創(chuàng)建一個CSocketClient,如果連接成功,那么就用這個CSocketClient與服務器端進行通信,如果連接不成功,則刪除這個建立的Socket,以節(jié)省資源??蛻舳顺绦蜻€是在函數(shù)OnSetup()中實現(xiàn),如下:

3)客戶端與服務器端數(shù)據(jù)的處理
當需要進行數(shù)據(jù)接收時,是通過重載CSocket類的函數(shù)OnReceive()來實現(xiàn)的,用于顯示給用戶或是引發(fā)其它的動作。 服務器端程序如下:


其中函數(shù)DoProcessData為數(shù)據(jù)處理函數(shù),對接收到的數(shù)據(jù)進行校驗、解析后生成新的實時數(shù)據(jù)庫類對象,存入動態(tài)數(shù)組中。
4)結束處理把所有不用的Socket刪除,釋放資源。
4 結束語
網(wǎng)絡的優(yōu)點使其應用逐漸廣泛,利用網(wǎng)絡互傳信息進行技術開發(fā)的項目越來越多。WindowsSockets是Windows下的標準程序設計接口。
VC++環(huán)境下,利用MFC的CSocket類,派生出所需要的套接字,利用套接字建立連接、傳輸數(shù)據(jù),對套接字事件進行處理,是一種簡潔高效的網(wǎng)絡編程方法。
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- 工業(yè)5G技術在智能制造中的應用與實踐解析2025/12/31 10:57:21
- 工業(yè)以太網(wǎng)交換機選型與現(xiàn)場應用技術指南2025/12/18 10:48:14
- 無線傳輸電路基礎,射頻前端設計、天線匹配與鏈路預算計算2025/10/27 13:55:50
- ASK 解調(diào)的核心要點與實現(xiàn)方式2025/9/5 16:46:17
- 雙偶極子天線:結構、特性與應用全解析2025/9/3 10:29:21









