音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

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.

應(yīng)用程序與Windows Sockets的關(guān)系
圖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.

面向連接的套接字應(yīng)用程序的時(shí)序

  圖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ò)編程方法。


  
關(guān)鍵詞:VC++環(huán)境下基于WinSock的網(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)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線(xiàn)人工客服

買(mǎi)家服務(wù):
賣(mài)家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線(xiàn)時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!