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

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

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

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

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

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


其中函數(shù)DoProcessData為數(shù)據(jù)處理函數(shù),對(duì)接收到的數(shù)據(jù)進(jìn)行校驗(yàn)、解析后生成新的實(shí)時(shí)數(shù)據(jù)庫(kù)類(lèi)對(duì)象,存入動(dòng)態(tài)數(shù)組中。
4)結(jié)束處理把所有不用的Socket刪除,釋放資源。
4 結(jié)束語(yǔ)
網(wǎng)絡(luò)的優(yōu)點(diǎn)使其應(yīng)用逐漸廣泛,利用網(wǎng)絡(luò)互傳信息進(jìn)行技術(shù)開(kāi)發(fā)的項(xiàng)目越來(lái)越多。WindowsSockets是Windows下的標(biāo)準(zhǔn)程序設(shè)計(jì)接口。
VC++環(huán)境下,利用MFC的CSocket類(lèi),派生出所需要的套接字,利用套接字建立連接、傳輸數(shù)據(jù),對(duì)套接字事件進(jìn)行處理,是一種簡(jiǎn)潔高效的網(wǎng)絡(luò)編程方法。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 工業(yè)5G技術(shù)在智能制造中的應(yīng)用與實(shí)踐解析2025/12/31 10:57:21
- 工業(yè)以太網(wǎng)交換機(jī)選型與現(xiàn)場(chǎng)應(yīng)用技術(shù)指南2025/12/18 10:48:14
- 無(wú)線(xiàn)傳輸電路基礎(chǔ),射頻前端設(shè)計(jì)、天線(xiàn)匹配與鏈路預(yù)算計(jì)算2025/10/27 13:55:50
- ASK 解調(diào)的核心要點(diǎn)與實(shí)現(xiàn)方式2025/9/5 16:46:17
- 雙偶極子天線(xiàn):結(jié)構(gòu)、特性與應(yīng)用全解析2025/9/3 10:29:21
- 編碼器的工作原理及作用1
- 超強(qiáng)整理!PCB設(shè)計(jì)之電流與線(xiàn)寬的關(guān)系2
- 三星(SAMSUNG)貼片電容規(guī)格對(duì)照表3
- 電腦藍(lán)屏代碼大全4
- 國(guó)標(biāo)委發(fā)布《電動(dòng)汽車(chē)安全要求第3部分:人員觸電防護(hù)》第1號(hào)修改單5
- 通俗易懂談上拉電阻與下拉電阻6
- 繼電器的工作原理以及驅(qū)動(dòng)電路7
- 電容單位8
- 跟我學(xué)51單片機(jī)(三):?jiǎn)纹瑱C(jī)串口通信實(shí)例9
- 一種三極管開(kāi)關(guān)電路設(shè)計(jì)10









