網(wǎng)絡(luò)編程實用教程第5章、MFCWinSock類的編程_第1頁
網(wǎng)絡(luò)編程實用教程第5章、MFCWinSock類的編程_第2頁
網(wǎng)絡(luò)編程實用教程第5章、MFCWinSock類的編程_第3頁
網(wǎng)絡(luò)編程實用教程第5章、MFCWinSock類的編程_第4頁
網(wǎng)絡(luò)編程實用教程第5章、MFCWinSock類的編程_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第5章 mfc winsockmfc winsock類的編程類的編程第五章第五章 mfc winsockmfc winsock類的編程類的編程第5章 mfc winsockmfc winsock類的編程類的編程第五章第五章 mfc winsockmfc winsock類的編程類的編程 為簡化套接字網(wǎng)絡(luò)編程,更方便地利為簡化套接字網(wǎng)絡(luò)編程,更方便地利用用windows windows 的消息驅(qū)動機制,微軟的的消息驅(qū)動機制,微軟的 mfcmfc提供了兩個套接字類,在不同的層次上對提供了兩個套接字類,在不同的層次上對win socket apiwin socket api函數(shù)進行了封裝,為編寫函數(shù)進

2、行了封裝,為編寫網(wǎng)絡(luò)通信程序,提供了兩種編程模式。網(wǎng)絡(luò)通信程序,提供了兩種編程模式。第5章 mfc winsockmfc winsock類的編程類的編程異步套節(jié)字類異步套節(jié)字類在低層次上對在低層次上對win sockets apiwin sockets api進行了封裝。進行了封裝。特點:特點:u 它的成員函數(shù)和它的成員函數(shù)和windows sockets apiwindows sockets api的函的函數(shù)調(diào)用直接對應(yīng)。數(shù)調(diào)用直接對應(yīng)。u 一個一個casyncsocketcasyncsocket對象代表了一個對象代表了一個windowswindows套接字,它是網(wǎng)絡(luò)通信的端點;套接字,它是

3、網(wǎng)絡(luò)通信的端點;u 將那些與套接字相關(guān)的將那些與套接字相關(guān)的windowswindows消息變?yōu)樵撓⒆優(yōu)樵擃惖幕卣{(diào)函數(shù)。類的回調(diào)函數(shù)。第5章 mfc winsockmfc winsock類的編程類的編程 從從casyncsocketcasyncsocket類派生,是對類派生,是對win sockets apiwin sockets api的高級封裝。繼承了的高級封裝。繼承了casyncsocketcasyncsocket類的許多成員函類的許多成員函數(shù)。數(shù)。csocketcsocket類的高級表現(xiàn)在三個方面:類的高級表現(xiàn)在三個方面:u csocketcsocket結(jié)合結(jié)合archivearch

4、ive類來使用套接字。類來使用套接字。u csocketcsocket管理了通信的許多方面,如管理了通信的許多方面,如字字節(jié)順序問題和字符串轉(zhuǎn)換問題節(jié)順序問題和字符串轉(zhuǎn)換問題。u csocketcsocket類為類為windowswindows消息的消息的后臺處理提后臺處理提供了阻塞供了阻塞的工作模式。的工作模式。 第5章 mfc winsockmfc winsock類的編程類的編程 在在mfcmfc中,有一個名為中,有一個名為afxsock.hafxsock.h的包含的包含文件,在這個文件中定義了文件,在這個文件中定義了casyncsocketcasyncsocket,csocketcsoc

5、ket,和,和csocketfilecsocketfile這三個套接字類。這三個套接字類。 第5章 mfc winsockmfc winsock類的編程類的編程5.1 casyncsocket casyncsocket類類casyncsocketcasyncsocket類從類從cobjectcobject類派生而來類派生而來:圖圖5.1 casyncsocket類的派生關(guān)系類的派生關(guān)系 第5章 mfc winsockmfc winsock類的編程類的編程serverserver端端clientclient端端構(gòu)造套節(jié)字,構(gòu)造套節(jié)字,casyncsocket sockservercasyncso

6、cket sockserver同前同前 sockclientsockclient創(chuàng)建創(chuàng)建socketsocket句柄,綁定到指定端口句柄,綁定到指定端口sockserver.sockserver.createcreate(nport,(nport,) )同前同前監(jiān)聽,準備接受連接請求監(jiān)聽,準備接受連接請求sockserver.listensockserver.listen()()連接到服務(wù)器連接到服務(wù)器sockclientsockclient.connection(ip,nport).connection(ip,nport)構(gòu)造新套接字,構(gòu)造新套接字, casyncsocket casyncs

7、ocket sockrecvsockrecv接受連接接受連接 sockrecv.accept(sockrecv)sockrecv.accept(sockrecv)接收數(shù)據(jù)接收數(shù)據(jù)sockrecv.receive(pbuf,nlen)sockrecv.receive(pbuf,nlen)發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)sockclient.send(pbuf,nlen)sockclient.send(pbuf,nlen)第5章 mfc winsockmfc winsock類的編程類的編程注意幾個問題:注意幾個問題:u 阻塞處理:不支持阻塞處理:不支持u 字節(jié)順序的轉(zhuǎn)換字節(jié)順序的轉(zhuǎn)換第5章 mfc winsock

8、mfc winsock類的編程類的編程 casyncsocket casyncsocket類對象稱為異步套接字對象。類對象稱為異步套接字對象。創(chuàng)建異步套接字對象分為兩個步驟:創(chuàng)建異步套接字對象分為兩個步驟:u 構(gòu)造一個構(gòu)造一個casyncsocketcasyncsocket對象對象: :casyncsocket aacasyncsocket aa;u 創(chuàng)建該對象的底層的創(chuàng)建該對象的底層的socketsocket句柄句柄: :aa.create(aa.create() )第5章 mfc winsockmfc winsock類的編程類的編程createcreate函數(shù)創(chuàng)建底層套接字句柄函數(shù)創(chuàng)建底層

9、套接字句柄 通過調(diào)用通過調(diào)用casyncsocketcasyncsocket類的類的create()create()成員函數(shù),成員函數(shù),創(chuàng)建該對象的底層套接字句柄,決定套接字對象的具創(chuàng)建該對象的底層套接字句柄,決定套接字對象的具體特性。調(diào)用格式為:體特性。調(diào)用格式為: bool create( uint nsocketport=0,int nsockettype = sock_stream,long ievent = fd_read |fd_write |fd_oob | fd_accept |fd_connect |fd_close, lpctstr lpszsocketaddress =

10、null ); 第5章 mfc winsockmfc winsock類的編程類的編程舉例:舉例: 創(chuàng)建一個使用創(chuàng)建一個使用2727端口的流式異步套接字端口的流式異步套接字對象。對象。 casyncsocket* psocket = new casyncsocket; int nport = 27; psocket-create( nport, sock_stream ); 第5章 mfc winsockmfc winsock類的編程類的編程1 1六種套接字相關(guān)的事件與通知消息六種套接字相關(guān)的事件與通知消息 createcreate函數(shù)的參數(shù)函數(shù)的參數(shù)ieventievent為可以選用的符號常為

11、可以選用的符號常量,是在量,是在winsock.hwinsock.h文件中定義的:文件中定義的:#define #define fd_readfd_read 0 x01 0 x01 可以可以recvrecv#define #define fd_writefd_write0 x020 x02 可以可以sendsend#define #define fd_oobfd_oob 0 x040 x04 有帶外數(shù)據(jù)到達有帶外數(shù)據(jù)到達#define #define fd_acceptfd_accept0 x080 x08 有連接請求有連接請求#define #define fd_connectfd_conn

12、ect 0 x100 x10 連接請求已處理連接請求已處理#define #define fd_closefd_close0 x200 x20 套接字已關(guān)閉套接字已關(guān)閉第5章 mfc winsockmfc winsock類的編程類的編程 他們代表他們代表mfc mfc 套接字對象可以接受并處理的六種套接字對象可以接受并處理的六種網(wǎng)絡(luò)事件,當事件發(fā)生時,套接字對象會收到相應(yīng)的網(wǎng)絡(luò)事件,當事件發(fā)生時,套接字對象會收到相應(yīng)的通知消息,并自動執(zhí)行套接字對象響應(yīng)的事件處理函通知消息,并自動執(zhí)行套接字對象響應(yīng)的事件處理函數(shù)。數(shù)。u fd_readfd_read事件:通知有數(shù)據(jù)可讀。事件:通知有數(shù)據(jù)可讀。u

13、 fd_writefd_write事件:通知可以寫數(shù)據(jù)。事件:通知可以寫數(shù)據(jù)。u fd_acceptfd_accept事件:通知監(jiān)聽套接字有連接請求可以接事件:通知監(jiān)聽套接字有連接請求可以接受。受。u fd_connectfd_connect事件:通知請求連接的套接字,連接的要事件:通知請求連接的套接字,連接的要求已被處理。求已被處理。u fd_closefd_close事件:通知套接字已關(guān)閉。事件:通知套接字已關(guān)閉。u fd_oobfd_oob事件:通知將有帶外數(shù)據(jù)到達。事件:通知將有帶外數(shù)據(jù)到達。第5章 mfc winsockmfc winsock類的編程類的編程2 2mfcmfc框架對于

14、六個網(wǎng)絡(luò)事件的處理框架對于六個網(wǎng)絡(luò)事件的處理 按照按照windowswindows的消息驅(qū)動機制,的消息驅(qū)動機制,mfcmfc框架應(yīng)框架應(yīng)當把消息發(fā)送給相應(yīng)的套接字對象,并調(diào)用作當把消息發(fā)送給相應(yīng)的套接字對象,并調(diào)用作為該對象成員函數(shù)的事件處理函數(shù)。事件與處為該對象成員函數(shù)的事件處理函數(shù)。事件與處理函數(shù)是一一映射的。理函數(shù)是一一映射的。 第5章 mfc winsockmfc winsock類的編程類的編程 在在afxsock.hafxsock.h文件的文件的casyncsocketcasyncsocket類的聲明中,定類的聲明中,定義了與這六個網(wǎng)絡(luò)事件對應(yīng)的事件處理函數(shù):義了與這六個網(wǎng)絡(luò)事件對

15、應(yīng)的事件處理函數(shù):u virtual void virtual void onreceiveonreceive(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_readfd_read事件事件u virtual void virtual void onsendonsend(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_writefd_write事件事件u virtual void virtual void onacceptonaccept(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng)

16、fd_acceptfd_accept事件事件u virtual void virtual void onconnectonconnect(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_connectfd_connect事件事件第5章 mfc winsockmfc winsock類的編程類的編程uvirtual void virtual void oncloseonclose(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_close fd_close 事件事件uvirtual void virtual void on

17、outofbanddataonoutofbanddata(int (int nerrorcode); nerrorcode); 對應(yīng)對應(yīng) fd_oob fd_oob 事件事件 當某個網(wǎng)絡(luò)事件發(fā)生時,當某個網(wǎng)絡(luò)事件發(fā)生時,mfc mfc 自動調(diào)用套接字自動調(diào)用套接字對象對應(yīng)的事件處理函數(shù)。這相當于給了套接字對對象對應(yīng)的事件處理函數(shù)。這相當于給了套接字對象一個通知,告訴它某個重要的事件已經(jīng)發(fā)生。所象一個通知,告訴它某個重要的事件已經(jīng)發(fā)生。所以也稱之為套接字類的通知函數(shù)或回調(diào)函數(shù)。以也稱之為套接字類的通知函數(shù)或回調(diào)函數(shù)。第5章 mfc winsockmfc winsock類的編程類的編程3 3重載套

18、接字對象的回調(diào)函數(shù)重載套接字對象的回調(diào)函數(shù) 如果從如果從casyncsocket casyncsocket 類上派生了自己的套接字類上派生了自己的套接字類,類, 你必須重載應(yīng)用程序所感興趣的那些網(wǎng)絡(luò)事件你必須重載應(yīng)用程序所感興趣的那些網(wǎng)絡(luò)事件所對應(yīng)的通知函數(shù)。所對應(yīng)的通知函數(shù)。 mfcmfc框架自動調(diào)用通知函數(shù),這樣可以在套接字框架自動調(diào)用通知函數(shù),這樣可以在套接字被通知的時候來優(yōu)化套接字的行為。被通知的時候來優(yōu)化套接字的行為。第5章 mfc winsockmfc winsock類的編程類的編程 服務(wù)器端套接字對象已經(jīng)進入監(jiān)聽狀態(tài)后,客服務(wù)器端套接字對象已經(jīng)進入監(jiān)聽狀態(tài)后,客戶應(yīng)用程序可以調(diào)用

19、戶應(yīng)用程序可以調(diào)用casyncsocketcasyncsocket類的類的connect()connect()成成員函數(shù),向服務(wù)器發(fā)出一個連接請求:員函數(shù),向服務(wù)器發(fā)出一個連接請求:格式一:格式一: bool bool connectconnect( lpctstr lpszhostaddress, ( lpctstr lpszhostaddress, uint nhostport ); uint nhostport );格式二:格式二: bool bool connectconnect( const sockaddr( const sockaddr* * lpsockaddr, lpsock

20、addr, int nsockaddrlen ) int nsockaddrlen );第5章 mfc winsockmfc winsock類的編程類的編程 如果調(diào)用成功或者發(fā)生了錯誤,當如果調(diào)用成功或者發(fā)生了錯誤,當調(diào)用結(jié)調(diào)用結(jié)束返回束返回時,都會發(fā)生時,都會發(fā)生fd_connectfd_connect事件,事件,mfcmfc框框架會自動調(diào)用客戶端套接字的架會自動調(diào)用客戶端套接字的onconnect()onconnect()事事件處理函數(shù),并將錯誤代碼作為參數(shù)傳送給它。件處理函數(shù),并將錯誤代碼作為參數(shù)傳送給它。它的原型調(diào)用格式如下,它的原型調(diào)用格式如下, void onconnect( in

21、t nerrorcode );void onconnect( int nerrorcode ); nerrorcode=0nerrorcode=0時時 連接成功連接成功第5章 mfc winsockmfc winsock類的編程類的編程 服務(wù)器端使用服務(wù)器端使用casyncsocketcasyncsocket流式套接字對象,流式套接字對象,按以下步驟來接收客戶端的連接請求:按以下步驟來接收客戶端的連接請求:1 1)服務(wù)器程序必須首先創(chuàng)建一個服務(wù)器程序必須首先創(chuàng)建一個casyncsocketcasyncsocket流式套接字對象,并調(diào)用它的流式套接字對象,并調(diào)用它的create create 成

22、員成員函數(shù)創(chuàng)建底層套接字句柄(監(jiān)聽專用)。函數(shù)創(chuàng)建底層套接字句柄(監(jiān)聽專用)。2 2)調(diào)用監(jiān)聽套接字對象的調(diào)用監(jiān)聽套接字對象的listenlisten成員函數(shù)。調(diào)成員函數(shù)。調(diào)用格式是:用格式是:b bool listen( int nconnectionbacklog=5)ool listen( int nconnectionbacklog=5);第5章 mfc winsockmfc winsock類的編程類的編程 當當listen listen 函數(shù)確認并接納了一個來自客戶端的函數(shù)確認并接納了一個來自客戶端的連接請求后,會觸發(fā)連接請求后,會觸發(fā)fd_acceptfd_accept事件,監(jiān)聽套

23、接字會事件,監(jiān)聽套接字會收到通知,表示監(jiān)聽套接子已經(jīng)接納了一個客戶的收到通知,表示監(jiān)聽套接子已經(jīng)接納了一個客戶的連接請求,連接請求,mfcmfc框架會自動調(diào)用框架會自動調(diào)用onacceptonaccept事件處理函事件處理函數(shù),原型如下:數(shù),原型如下:void onaccept( int nerrorcode );void onaccept( int nerrorcode ); 應(yīng)重載此函數(shù),在其中調(diào)用監(jiān)聽套接字對象的應(yīng)重載此函數(shù),在其中調(diào)用監(jiān)聽套接字對象的acceptaccept函數(shù),來接收客戶端的連接請求。函數(shù),來接收客戶端的連接請求。第5章 mfc winsockmfc winsock類

24、的編程類的編程3 3)創(chuàng)建一個新的空的套接字對象。這個套接字創(chuàng)建一個新的空的套接字對象。這個套接字專門用來與客戶端連接,并進行數(shù)據(jù)的傳輸。專門用來與客戶端連接,并進行數(shù)據(jù)的傳輸。稱為連接套接字。稱為連接套接字。4 4)調(diào)用監(jiān)聽套接字對象的調(diào)用監(jiān)聽套接字對象的acceptaccept成員函數(shù),調(diào)成員函數(shù),調(diào)用格式為:用格式為:virtual bool accept( casyncsocket & rconnectedsocket,sockaddr * lpsockaddr = null,int * lpsockaddrlen = null );第5章 mfc winsockmfc win

25、sock類的編程類的編程對于流式套接字對象:對于流式套接字對象:u 則使用則使用casyncsocketcasyncsocket類的類的send send 成員函成員函數(shù)向流式套接字發(fā)送數(shù)據(jù)數(shù)向流式套接字發(fā)送數(shù)據(jù)u 使用使用receivereceive成員函數(shù)從流式套接字接成員函數(shù)從流式套接字接收數(shù)據(jù)。收數(shù)據(jù)。第5章 mfc winsockmfc winsock類的編程類的編程1 1用用sendsend成員函數(shù)發(fā)送數(shù)據(jù)成員函數(shù)發(fā)送數(shù)據(jù)格式:格式:virtual int send( const void* lpbuf, int nbuflen, int nflags = 0); 對于一個對于一個

26、casyncsocketcasyncsocket套接字對象,當它的套接字對象,當它的發(fā)發(fā)送緩沖區(qū)騰空送緩沖區(qū)騰空時,會激發(fā)時,會激發(fā)fd_writefd_write事件,套接字會事件,套接字會得到通知,得到通知,mfc mfc 框架會自動調(diào)用這個套接字對象的框架會自動調(diào)用這個套接字對象的onsend onsend 事件處理函數(shù)。事件處理函數(shù)。 應(yīng)重載這個函數(shù),在其中應(yīng)重載這個函數(shù),在其中調(diào)用調(diào)用sendsend成員函數(shù)來發(fā)送數(shù)據(jù)。成員函數(shù)來發(fā)送數(shù)據(jù)。第5章 mfc winsockmfc winsock類的編程類的編程2 2用用receivereceive成員函數(shù)接收數(shù)據(jù)成員函數(shù)接收數(shù)據(jù)格式:格

27、式:int int receivereceive( void( void* * lpbuflpbuf, , int int nbuflennbuflen, , int int nflagsnflags = 0); = 0); 對于一個對于一個casyncsocket casyncsocket 套接字對象,當有套接字對象,當有數(shù)據(jù)到數(shù)據(jù)到達它的接收隊列時達它的接收隊列時,會激發(fā),會激發(fā)fd_readfd_read事件,套接字會事件,套接字會得到已經(jīng)有數(shù)據(jù)到達的通知,得到已經(jīng)有數(shù)據(jù)到達的通知,mfcmfc框架會自動調(diào)用這框架會自動調(diào)用這個套接字對象的個套接字對象的 onreceiveonrecei

28、ve事事 件處理函數(shù)。應(yīng)重載件處理函數(shù)。應(yīng)重載這個函數(shù),調(diào)用這個函數(shù),調(diào)用receivereceive成員函數(shù)來接收數(shù)據(jù)。成員函數(shù)來接收數(shù)據(jù)。第5章 mfc winsockmfc winsock類的編程類的編程1 1使用使用casyncsocketcasyncsocket類的類的closeclose成員函數(shù)成員函數(shù)格式:格式:void void closeclose( );( );2 2使用使用casyncsocketcasyncsocket類的類的shutdown()shutdown()成員函成員函數(shù)數(shù) 使用使用shutdown()shutdown()成員函數(shù),可以選擇關(guān)閉套接成員函數(shù),可以

29、選擇關(guān)閉套接字的方式。將套接字的方式。將套接字置為不能發(fā)送數(shù)據(jù),或不能接字置為不能發(fā)送數(shù)據(jù),或不能接收數(shù)據(jù),或二者均不能的狀態(tài)。收數(shù)據(jù),或二者均不能的狀態(tài)。格式:格式:bool bool shutdownshutdown(int (int nhownhow=sends);=sends);receivesreceives、bothboth 第5章 mfc winsockmfc winsock類的編程類的編程 調(diào)用調(diào)用casyncsocketcasyncsocket對象的成員函數(shù)后,返對象的成員函數(shù)后,返回一個邏輯型的值:回一個邏輯型的值:u 執(zhí)行成功,返回執(zhí)行成功,返回truetrue;u 失敗

30、,返回失敗,返回falsefalse。 調(diào)用調(diào)用casyncsocketcasyncsocket對象的對象的getlasterrorgetlasterror()()成員函數(shù),來獲取更詳細的錯誤代碼,并進行成員函數(shù),來獲取更詳細的錯誤代碼,并進行相應(yīng)的處理。相應(yīng)的處理。格式:格式:int getlasterror( );int getlasterror( );第5章 mfc winsockmfc winsock類的編程類的編程1 1關(guān)于套接字屬性的函數(shù)關(guān)于套接字屬性的函數(shù)u setsocketoptsetsocketopt:設(shè)置底層套接字的屬性;:設(shè)置底層套接字的屬性;u getsocketop

31、tgetsocketopt:獲取套接字的設(shè)置信息;:獲取套接字的設(shè)置信息;u ioctlioctl:控制套接字的工作模式;:控制套接字的工作模式;第5章 mfc winsockmfc winsock類的編程類的編程2 2發(fā)送和接收數(shù)據(jù)發(fā)送和接收數(shù)據(jù) 如果創(chuàng)建的是如果創(chuàng)建的是數(shù)據(jù)報類型數(shù)據(jù)報類型的套接字:的套接字:u 用用sendtosendto()()成員函數(shù)來向指定的地址發(fā)成員函數(shù)來向指定的地址發(fā)送數(shù)據(jù),事先不需要建立發(fā)送端和接收送數(shù)據(jù),事先不需要建立發(fā)送端和接收端之間的連接端之間的連接u 用用receivefromreceivefrom()()成員函數(shù)可以從某個成員函數(shù)可以從某個指定的網(wǎng)絡(luò)

32、地址接收數(shù)據(jù)。指定的網(wǎng)絡(luò)地址接收數(shù)據(jù)。第5章 mfc winsockmfc winsock類的編程類的編程sendtosendto有兩種重載的形式:有兩種重載的形式:int sendto( const void* lpbuf, int nbuflen, uint nhostport,lpctstr lpszhostaddress = null,int nflags = 0 );int sendto( const void* lpbuf, int nbuflen, const sockaddr*lpsockaddr, int nsockaddrlen, int nflags= 0);第5章 mf

33、c winsockmfc winsock類的編程類的編程receivefromreceivefrom也有兩種重載的形式也有兩種重載的形式: :int receivefrom( void* lpbuf, int nbuflen, cstring& rsocketaddress,uint& rsocketport, int nflags = 0 );int receivefrom( void* lpbuf, int nbuflen, sockaddr* lpsockaddr, int* lpsockaddrlen, int nflags = 0 ); 第5章 mfc winsock

34、mfc winsock類的編程類的編程5.2 csocket類類 csocket csocket類是從類是從casyncsocketcasyncsocket類派生而來類派生而來的,它們的派生關(guān)系如圖的,它們的派生關(guān)系如圖5.25.2:圖圖5.2 csocket5.2 csocket類的派生關(guān)系類的派生關(guān)系 第5章 mfc winsockmfc winsock類的編程類的編程5.2 csocket類類 從從casyncsocketcasyncsocket類派生,是對類派生,是對win sockets apiwin sockets api的高級封裝。繼承了的高級封裝。繼承了casyncsocket

35、casyncsocket類的許多成員函類的許多成員函數(shù)。數(shù)。csocketcsocket類的高級表現(xiàn)在三個方面:類的高級表現(xiàn)在三個方面:u csocketcsocket結(jié)合結(jié)合archivearchive類來使用套接字。類來使用套接字。u csocketcsocket管理了通信的許多方面,如管理了通信的許多方面,如字字節(jié)順序問題和字符串轉(zhuǎn)換問題節(jié)順序問題和字符串轉(zhuǎn)換問題。u csocketcsocket類為類為windowswindows消息的消息的后臺處理提后臺處理提供了阻塞供了阻塞的工作模式。的工作模式。 第5章 mfc winsockmfc winsock類的編程類的編程分為兩個步驟:分

36、為兩個步驟:u 調(diào)用調(diào)用csocketcsocket類的構(gòu)造函數(shù),創(chuàng)建一個空的類的構(gòu)造函數(shù),創(chuàng)建一個空的csocketcsocket對象。對象。u 調(diào)用此調(diào)用此csocketcsocket對象的對象的create()create()成員函數(shù),創(chuàng)成員函數(shù),創(chuàng)建對象的底層套接字。調(diào)用格式是:建對象的底層套接字。調(diào)用格式是:bool create( uint bool create( uint nsocketportnsocketport = = 端口號,端口號, int nint nsocketportsocketport=sock_stream|sock_dgram=sock_stream|so

37、ck_dgram, lpctstr lpctstr lpszsocketaddresslpszsocketaddress= =套接字用的套接字用的ip)ip); 如果用如果用carchivecarchive對象和套接字一起進行數(shù)據(jù)傳輸對象和套接字一起進行數(shù)據(jù)傳輸工作,必須使用流式套接字工作,必須使用流式套接字。第5章 mfc winsockmfc winsock類的編程類的編程 csocket csocket類類connect()connect()、listen()listen()、accept()accept()來建來建立服務(wù)器和客戶機套接字之間的連接,與基類的使用立服務(wù)器和客戶機套接字之間

38、的連接,與基類的使用方法相同。方法相同。不同點:不同點:u csocketcsocket的的connectconnect()()和和acceptaccept()()支持支持阻塞調(diào)用阻塞調(diào)用。調(diào)用調(diào)用connect()connect()函數(shù)時會發(fā)生阻塞,直到成功函數(shù)時會發(fā)生阻塞,直到成功地建立了連接或有錯誤發(fā)生才返回。地建立了連接或有錯誤發(fā)生才返回。u csocketcsocket對象對象不調(diào)用不調(diào)用onconnectonconnect()()事件處理函數(shù)。事件處理函數(shù)。第5章 mfc winsockmfc winsock類的編程類的編程u 數(shù)據(jù)報套接字:數(shù)據(jù)報套接字:使用使用sendto()s

39、endto()、receivefrom() receivefrom() 成員函數(shù)來發(fā)送和接收數(shù)據(jù)。成員函數(shù)來發(fā)送和接收數(shù)據(jù)。 u 對于流式套接字:對于流式套接字:使用使用send()send()、receive()receive()函數(shù)函數(shù)來發(fā)送和接收數(shù)據(jù),來發(fā)送和接收數(shù)據(jù),調(diào)用方式與調(diào)用方式與casyncsocketcasyncsocket類相同,類相同,不同在于:不同在于:u csocketcsocket類的這些函數(shù)工作在阻塞的模式。可以類的這些函數(shù)工作在阻塞的模式。可以將將csocketcsocket類與類與carchivecarchive類和類和csocketfilecsocketfi

40、le類結(jié)類結(jié)合,來發(fā)送和接收數(shù)據(jù)。合,來發(fā)送和接收數(shù)據(jù)。u csocketcsocket對象對象從不調(diào)用從不調(diào)用onsend()onsend()事件處理函數(shù)。事件處理函數(shù)。 第5章 mfc winsockmfc winsock類的編程類的編程 csocket csocket對象在調(diào)用對象在調(diào)用connectconnect、sendsend、acceptaccept、closeclose、receivereceive等成員函數(shù)后,這些函數(shù)在完成任等成員函數(shù)后,這些函數(shù)在完成任務(wù)之后才會返回。因此,務(wù)之后才會返回。因此,connectconnect和和sendsend不會導(dǎo)致不會導(dǎo)致onconne

41、ctonconnect和和onsendonsend被調(diào)用。被調(diào)用。第5章 mfc winsockmfc winsock類的編程類的編程 使用使用csocketcsocket的的最大優(yōu)點最大優(yōu)點在于,程序可在連接的在于,程序可在連接的兩端兩端通過通過carchivecarchive對象來進行數(shù)據(jù)傳輸對象來進行數(shù)據(jù)傳輸。方法是:。方法是:u 創(chuàng)建創(chuàng)建csocketcsocket類對象類對象u 創(chuàng)建一個基于創(chuàng)建一個基于csocketfilecsocketfile類的文件對象,類的文件對象,并把它的指針傳給已創(chuàng)建的并把它的指針傳給已創(chuàng)建的csocketcsocket對象,對象,u 分別創(chuàng)建分別創(chuàng)建用于

42、輸入和輸出的用于輸入和輸出的carchivecarchive對象,對象,并將它們與并將它們與csocketfilecsocketfile文件對象連接,文件對象連接,u 利用利用carchivecarchive對象來發(fā)送和接收數(shù)據(jù)。對象來發(fā)送和接收數(shù)據(jù)。第5章 mfc winsockmfc winsock類的編程類的編程示例代碼:示例代碼: csocket exsocket; csocketfile* pexfile; carchive* pcarchivein; carchive* pcarchiveout; exsocket.create(); pexfile = new csocketfi

43、le ( & exsocket,true); pcarchivein = new carchive ( pexfile, carchive:load); pcarchiveout = new carchive ( pexfile, archive:store);第5章 mfc winsockmfc winsock類的編程類的編程圖圖5.3 csocket5.3 csocket、carchivecarchive和和csocketfilecsocketfile類在傳輸數(shù)據(jù)時的作用類在傳輸數(shù)據(jù)時的作用 第5章 mfc winsockmfc winsock類的編程類的編程資源釋放:資源釋放:套

44、節(jié)字對象:套節(jié)字對象:u 調(diào)用調(diào)用closeclose() () 釋放。釋放。其他對象:其他對象:u 包括包括carchivecarchive對象、對象、csocketfilecsocketfile對象和對象和csocketcsocket對象,可以將它們銷毀;對象,可以將它們銷毀;u 可以不作處理,程序終止時,自動調(diào)用對象可以不作處理,程序終止時,自動調(diào)用對象的析構(gòu)函數(shù),從而釋放占用的資源。的析構(gòu)函數(shù),從而釋放占用的資源。第5章 mfc winsockmfc winsock類的編程類的編程 下面給出針對流式套接字的下面給出針對流式套接字的csocketcsocket類的編類的編程模型。分為服務(wù)

45、器端和客戶端。程模型。分為服務(wù)器端和客戶端。1、服務(wù)器端csocket sockserv; sockserv.create( nport ); sockserv.listen();/ 啟動監(jiān)聽。啟動監(jiān)聽。csocket sockrecv; / 服務(wù)器端連接套接字服務(wù)器端連接套接字 sockserv.accept( sockrecv); csockfile* file ;第5章 mfc winsockmfc winsock類的編程類的編程file = new csockfile( &sockrecv ); carchive* arin, arout;arin = carchive ( &

46、amp;file, carchive:load); arout = carchive( &file, carchive:store);arin dwvalue; / 數(shù)據(jù)輸入。數(shù)據(jù)輸入。adout dwvalue; adout dwvalue; sockclient.close();第5章 mfc winsockmfc winsock類的編程類的編程上節(jié)課小結(jié)上節(jié)課小結(jié)1 1、兩個套接字類:、兩個套接字類: 微軟的微軟的 mfcmfc提供了兩個套接字類,在不同的層提供了兩個套接字類,在不同的層次上對次上對win socket apiwin socket api函數(shù)進行了封裝,為編寫網(wǎng)函

47、數(shù)進行了封裝,為編寫網(wǎng)絡(luò)通信程序,提供了兩種編程模式:絡(luò)通信程序,提供了兩種編程模式:u casyncsocketcasyncsocket類類u csocketcsocket類類第5章 mfc winsockmfc winsock類的編程類的編程上節(jié)課小結(jié)上節(jié)課小結(jié)2 2、兩個類的區(qū)別與聯(lián)系:、兩個類的區(qū)別與聯(lián)系: casyncsocketcasyncsocket類:類:在低層次上對在低層次上對win sockets apiwin sockets api進行了進行了封裝。封裝。u 它的成員函數(shù)和它的成員函數(shù)和windows sockets apiwindows sockets api的函數(shù)調(diào)用

48、直的函數(shù)調(diào)用直接對應(yīng)。接對應(yīng)。u 一個一個casyncsocketcasyncsocket對象代表了一個對象代表了一個windowswindows套接字;套接字;u 將與套接字相關(guān)的將與套接字相關(guān)的windowswindows消息變?yōu)轭惖幕卣{(diào)函數(shù)。消息變?yōu)轭惖幕卣{(diào)函數(shù)。 csocketcsocket類:類:從從casyncsocketcasyncsocket類派生類派生u csocketcsocket結(jié)合結(jié)合archivearchive類來使用套接字類來使用套接字。u 管理了通信的許多方面,如管理了通信的許多方面,如字節(jié)順序問題和字符串字節(jié)順序問題和字符串轉(zhuǎn)換問題轉(zhuǎn)換問題。u 提供了阻塞提供了

49、阻塞的工作模式。的工作模式。第5章 mfc winsockmfc winsock類的編程類的編程上節(jié)課小結(jié)上節(jié)課小結(jié)casyncsocketcasyncsocket能產(chǎn)生的消息及對應(yīng)的處理過程:能產(chǎn)生的消息及對應(yīng)的處理過程:u virtual void virtual void onreceiveonreceive(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_readfd_read事件事件u virtual void virtual void onsendonsend(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd

50、_writefd_write事件事件u virtual void virtual void onacceptonaccept(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_acceptfd_accept事件事件u virtual void virtual void onconnectonconnect(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_connectfd_connect事件事件u virtual void virtual void oncloseonclose(int nerrorcode); (int

51、 nerrorcode); 對應(yīng)對應(yīng) fd_close fd_close 事件事件u virtual void virtual void onoutofbanddataonoutofbanddata(int nerrorcode); (int nerrorcode); 對應(yīng)對應(yīng) fd_oob fd_oob 事件事件第5章 mfc winsockmfc winsock類的編程類的編程上節(jié)課小結(jié)上節(jié)課小結(jié)圖圖5.3 csocket5.3 csocket、carchivecarchive和和csocketfilecsocketfile類在傳輸數(shù)據(jù)時的作用類在傳輸數(shù)據(jù)時的作用 第5章 mfc wins

52、ockmfc winsock類的編程類的編程第5章 mfc winsockmfc winsock類的編程類的編程一個簡單的聊天室:一個簡單的聊天室:u 程序采用程序采用c/sc/s模式,分為客戶端程序和服務(wù)模式,分為客戶端程序和服務(wù)器端程序器端程序 。u 服務(wù)器只能支持一個客戶,實際是一個服務(wù)器只能支持一個客戶,實際是一個點對點對點通信點通信的程序的程序 。u 客戶端和服務(wù)器通過網(wǎng)絡(luò)交換聊天的字符串客戶端和服務(wù)器通過網(wǎng)絡(luò)交換聊天的字符串內(nèi)容內(nèi)容 ,并在窗口的列表框中顯示。,并在窗口的列表框中顯示。 第5章 mfc winsockmfc winsock類的編程類的編程1 1使用使用mfc app

53、wizardmfc appwizard創(chuàng)建客戶端應(yīng)用程序框架。創(chuàng)建客戶端應(yīng)用程序框架。第5章 mfc winsockmfc winsock類的編程類的編程2 2為對話框界面添加控件對象為對話框界面添加控件對象第5章 mfc winsockmfc winsock類的編程類的編程3 3為對話框中的控件對象定義成員變量為對話框中的控件對象定義成員變量第5章 mfc winsockmfc winsock類的編程類的編程4 4創(chuàng)建從創(chuàng)建從casyncsocketcasyncsocket類繼承的派生類類繼承的派生類n為了能夠捕獲為了能夠捕獲并響應(yīng)并響應(yīng)socketsocket事事件,應(yīng)創(chuàng)建用戶件,應(yīng)創(chuàng)建用

54、戶自己的套接字自己的套接字類類 ,它應(yīng)當從,它應(yīng)當從casyncsocketcasyncsocket類類派生,還能將套派生,還能將套接字事件傳遞給接字事件傳遞給對話框,以便執(zhí)對話框,以便執(zhí)行用戶自己的事行用戶自己的事件處理函件處理函數(shù)。數(shù)。第5章 mfc winsockmfc winsock類的編程類的編程n為套接字類添加響應(yīng)消息的事件處理成員函數(shù)為套接字類添加響應(yīng)消息的事件處理成員函數(shù)onconnect( )onconnect( )onreceive( )onreceive( )onclose( )onclose( )第5章 mfc winsockmfc winsock類的編程類的編程n 為

55、套接字類添加一般的成員函數(shù)和成員變量為套接字類添加一般的成員函數(shù)和成員變量ctalkcdlg ctalkcdlg * *m_pdlgm_pdlg; ;void void setparentsetparent(ctalkcdlg (ctalkcdlg * *m_pdlg);m_pdlg);第5章 mfc winsockmfc winsock類的編程類的編程n手工添加其他代碼手工添加其他代碼 對于對于mysocket.hmysocket.h,應(yīng)在文件開頭,添加對于此應(yīng),應(yīng)在文件開頭,添加對于此應(yīng)用程序?qū)υ捒蝾惖穆暶鳌S贸绦驅(qū)υ捒蝾惖穆暶?。class ctalkcdlg;class ctalkcdl

56、g;對于對于mysocket.cppmysocket.cpp,有四處添加:,有四處添加: 應(yīng)在文件開頭,添加包含文件說明。應(yīng)在文件開頭,添加包含文件說明。#include “talkcdlg.h”#include “talkcdlg.h” 在構(gòu)造函數(shù)中,添加對于對話框指針成員變量的在構(gòu)造函數(shù)中,添加對于對話框指針成員變量的初始化代碼:初始化代碼:cmysocketcmysocket:cmysocket() m_pdlg = null; cmysocket() m_pdlg = null; 第5章 mfc winsockmfc winsock類的編程類的編程 在析構(gòu)函數(shù)中,添加對于對話框指針成員

57、變量的在析構(gòu)函數(shù)中,添加對于對話框指針成員變量的初始化代碼:初始化代碼:cmysocketcmysocket:cmysocket() m_pdlg = null; cmysocket() m_pdlg = null; 為成員函數(shù)為成員函數(shù)setparentsetparent和事件處理函數(shù)和事件處理函數(shù)onconnectonconnect,oncloseonclose和和onreceiveonreceive添加代碼。添加代碼。第5章 mfc winsockmfc winsock類的編程類的編程5 5為對話框類添加控件對象事件的響應(yīng)函數(shù)為對話框類添加控件對象事件的響應(yīng)函數(shù)第5章 mfc winso

58、ckmfc winsock類的編程類的編程6 6為為ctalkcdlgctalkcdlg對話框類添加其它的成員函數(shù)和對話框類添加其它的成員函數(shù)和成員變量成員變量成員變量:成員變量:cmysocket m_sconnectsocket;cmysocket m_sconnectsocket;/與服務(wù)器端連接的套接字與服務(wù)器端連接的套接字成員函數(shù):成員函數(shù):void onclose(); / void onclose(); / 用來處理與服務(wù)器端的通信。用來處理與服務(wù)器端的通信。void onconnect();void onconnect();void onreceive();void onrec

59、eive(); 第5章 mfc winsockmfc winsock類的編程類的編程7 7手工添加的代碼手工添加的代碼 在在ctalkcdlgctalkcdlg類的類的talkcdlg.htalkcdlg.h中添加對中添加對mysocket.hmysocket.h的包含命令,來獲得對于套接字支持:的包含命令,來獲得對于套接字支持: #include “mysocket.h”#include “mysocket.h” 在在ctalkcdlgctalkcdlg對話框類的對話框類的talkcdlg.cpptalkcdlg.cpp中添加對于中添加對于控件變量的初始化代碼:控件變量的初始化代碼:bool

60、 ctalkcdlg:bool ctalkcdlg:oninitdialogoninitdialog()() m_strservname=“l(fā)ocalhost”; / m_strservname=“l(fā)ocalhost”; / 服務(wù)器名服務(wù)器名 m_nservport=1000; / m_nservport=1000; / 服務(wù)端口服務(wù)端口 updatedata(false); / updatedata(false); / 更新用戶界面更新用戶界面m_sconnectsocket.setparent(this);m_sconnectsocket.setparent(this);第5章 mfc winsockmfc winsock類的編程類的編程8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論