關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > Windows平臺(tái)下的網(wǎng)絡(luò)異步通訊編程技術(shù)

Windows平臺(tái)下的網(wǎng)絡(luò)異步通訊編程技術(shù)

作者: 時(shí)間:2012-04-28 來源:網(wǎng)絡(luò) 收藏

2 CAsyncSocket類的簡(jiǎn)單介紹
微軟公司開發(fā)的Visual C++是平臺(tái)下強(qiáng)有力的開發(fā)工具。VC++對(duì)編程的支持有socket支持,WinInet支持,MAPI和ISAPl支持等,其中 Sockets API是TCP/IP環(huán)境下開發(fā)最為通用的API。為簡(jiǎn)化WinSock編程,使用戶專注于應(yīng)用程序的算法設(shè)計(jì),Microsoft的基本類庫(kù)(Microsoft Foundation Class,MFC)提供了兩個(gè)用于Winsock編程的類,分別是CAsyncSocket類和CSocket類:這兩個(gè)類在不同程度上對(duì)WinSock API函數(shù)進(jìn)行了封裝,具有直接調(diào)用Sockets API的靈活性。CAsyncSocket類是從CObject類派生出來的,在很低的級(jí)別上一對(duì)一封裝了 Sockets API,因此具有直接調(diào)用Socket API的靈活性,可以使用面向?qū)ο蟮姆绞竭M(jìn)行Socket編程,CAsync Soc ket類可以方便地調(diào)用其他MFC對(duì)象,處理多個(gè)網(wǎng)絡(luò)協(xié)議。與CSocket類相比,CAsyncSocket類有以下特點(diǎn)。
2.1 CAsyncSocket類對(duì)象的創(chuàng)建
CAsyncSocket是一個(gè)異步非阻塞Socket封裝類,CAsvncSocket的Create()函數(shù),除創(chuàng)建了一個(gè)Socket以外,CAsyncSocket::Create()的參數(shù)IEvent指明了想要處理的Socket事件,關(guān)心的事件被指定以后,這個(gè)Socket默認(rèn)就被用作了異步方式。CAsyncSocket還創(chuàng)建了個(gè)CSoc ketWnd窗口對(duì)象,并使用WSAAsyncSelect()將這個(gè)SOCKET與該窗口對(duì)象關(guān)聯(lián),以使該窗口對(duì)象處理來自Socket的事件(消息),然而CSocket Wnd收到Socket事件之后,只是簡(jiǎn)單地回調(diào)CAsyncSocket::OnReceive()等虛函數(shù)。所以CAsyncSocket的派生類,只需在這些虛函數(shù)里添加發(fā)送和接收的代碼,除此外Create()函數(shù)還調(diào)用Bind()函數(shù)將Socket對(duì)象與指定的地址綁定。其函數(shù)原型為:
BOOL CAsyncSocket::Create(UINT nSocketPort=0,intnSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACC EPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);
在重載函數(shù)中都有一個(gè)參數(shù)nErrorCode,為零則表示正常完成,非零則表示錯(cuò)誤。通過int CAsyncSocket::GetLastError()可以得到錯(cuò)誤值。參數(shù)nSocketPort為使用的端口號(hào),為零則表示由系統(tǒng)自動(dòng)選擇,通常在客戶端都使用這個(gè)選擇。參數(shù)nSocketType為使用的協(xié)議族,SOCK_STREAM表明使用有連接的服務(wù),SOCK_DGRAM表明使用無連接的數(shù)據(jù)報(bào)服務(wù)。參數(shù)lpszSocketAddress指定了IP地址,可以使用點(diǎn)分法表示如192.168.0.28,也可以使用默認(rèn)值,此時(shí)函數(shù)將默認(rèn)綁定本機(jī)IP地址。
2.2 CAsyncSocket類的異步選擇機(jī)制
在網(wǎng)絡(luò)通訊中,由于網(wǎng)絡(luò)擁擠或數(shù)據(jù)量大的原因,數(shù)據(jù)的收發(fā)不能立刻完成,收發(fā)數(shù)據(jù)的函數(shù)因此不能返回,從而出現(xiàn)阻塞現(xiàn)象。Win Sock對(duì)有可能阻塞的函數(shù)提供了兩種處理方式:阻塞和非阻塞方式。在阻塞方式下,收發(fā)數(shù)據(jù)的函數(shù)在被調(diào)用后一直要到傳送完畢或者出錯(cuò)才能返回。對(duì)于非阻塞方式,函數(shù)被調(diào)用后立即返回,傳送完成后由WinSock給程序發(fā)一個(gè)事先約定好的消息。使用Windows Sockets實(shí)現(xiàn)Windows網(wǎng)絡(luò)程序設(shè)計(jì)的關(guān)鍵就是它提供了對(duì)網(wǎng)絡(luò)事件基于消息的異步存取,用于注冊(cè)應(yīng)用程序感興趣的網(wǎng)絡(luò)事件。Winsock過WSAAsyncse lect()動(dòng)地設(shè)置套接字處于非阻塞方式,注冊(cè)一個(gè)或多個(gè)網(wǎng)絡(luò)事件。當(dāng)被提名的網(wǎng)絡(luò)事件發(fā)生時(shí),Windows應(yīng)用程序的窗口函數(shù)將收到一個(gè)消息,消息附帶的參數(shù)指示被提名過的某一網(wǎng)絡(luò)事件。WSAAsyncSelect的原型如下:
int PASCAL FAR WSAAsyncSelect(SOCTET s,HWND hWnd,unsignedint wMsg,long lEvent)它請(qǐng)求Windows Sockets DLL在檢測(cè)到套接字上發(fā)生的網(wǎng)絡(luò)事件時(shí),向窗口hWnd發(fā)送一個(gè)消息。MFC在實(shí)現(xiàn)CAsyncSocket類時(shí),定義了一個(gè)內(nèi)部類CSocket Wnd,當(dāng)使用Create函數(shù)產(chǎn)生Socket句柄時(shí),就Attach這個(gè)Socket到一個(gè)窗口上,并且CAsyncSocket的DoCallBack函數(shù)為該窗口的回調(diào)函數(shù)。在此函數(shù)內(nèi)根據(jù)不同的消息參數(shù),響應(yīng)各個(gè)網(wǎng)絡(luò)事件。
2.3 CAsyncSocket對(duì)網(wǎng)絡(luò)事件的響應(yīng)
在理解以上機(jī)制后,再了解一下CAsyncSocket的通信流程。
CAsvncSocket在AsyncSelect函數(shù)中調(diào)用WSAAsyncselect函數(shù)注冊(cè)感興趣的網(wǎng)絡(luò)事件。這樣,當(dāng)一個(gè)網(wǎng)絡(luò)事件發(fā)生時(shí),經(jīng)過MFC的消息循環(huán),就可以由CAsyncSocket的DoCAllBack函數(shù)按事件的類型:FD_READ,F(xiàn)D_WRITE,F(xiàn)D_ACCEPT,F(xiàn)D_CONNECT和FD_CLOSE來分別調(diào)用OnReceive(),OnSend(),OnAccept(),OnConnect()和OnClose()函數(shù)。具體的對(duì)應(yīng)關(guān)系如表1所示。

本文引用地址:http://m.butianyuan.cn/article/202341.htm

b.JPG


tcp/ip相關(guān)文章:tcp/ip是什么




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉