版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第5章 MFC WinSock類的編程 為簡化套接字網(wǎng)絡(luò)編程,更方便地利用Windows的消息驅(qū)動機制,微軟的基礎(chǔ)類庫(Microsoft Foundation Class Libary,簡稱MFC),提供了兩個套接字類,在不同的層次上對Windows Socket API函數(shù)進行了封裝,為編寫Windows Socket網(wǎng)絡(luò)通信程序,提供了兩種編程模式。 CAsyncSocket類,在很低的層次上對Windows Sockets API進行了封裝。 它的成員函數(shù)和Windows Sockets API的函數(shù)調(diào)用直接對應(yīng)。一個CAsyncSocket對象代表了一個Windows套接字。它是網(wǎng)絡(luò)
2、通信的端點。除了把套接字封裝成C+的面向?qū)ο蟮男问焦┏绦騿T使用以外,這個類唯一所增加的抽象就是將那些與套接字相關(guān)的Windows消息變?yōu)镃AsyncSocket類的回調(diào)函數(shù)。 CSocket類,從CAsyncSocket類派生,是對Windows Sockets API的高級封裝。CSocket類繼承了CAsyncSocket類的許多成員函數(shù),用法一致。CSocket類的高級表現(xiàn)在三個方面:(1)CSocket結(jié)合archive類來使用套接字。(2)CSocket管理了通信的許多方面,如字節(jié)順序問題和字符串轉(zhuǎn)換問題。 (3)CSocket類為Windows消息的后臺處理提供了阻塞的工作模式。
3、這兩個類提供了事件處理函數(shù),編程者通過對事件處理函數(shù)進行重載,可方便地對套接字發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等事件進行處理。同時,可以結(jié)合MFC的其它類來使用這兩個套接字類,并利用MFC的各種可視化向?qū)?,從而大大簡化了編程?在MFC中,有一個名為afxSock.h的包含文件,在這個文件中定義了CAsyncSocket,CSocket,和CSocketFile這三個套接字類。 5.1.1 使用CAsyncSocket類的一般步驟網(wǎng)絡(luò)應(yīng)用程序一般采用客戶/服務(wù)器模式,它們使用使用CAsyncSocket類編程的步驟有所不同。 5.1.2 創(chuàng)建CAsyncSocket類對象 將CAsyncSocket類對象稱
4、為異步套接字對象。創(chuàng)建異步套接字對象一般分為兩個步驟,首先構(gòu)造一個CAsyncSocket對象,再創(chuàng)建該對象的底層的SOCKET句柄。1創(chuàng)建空的異步套接字對象 通過調(diào)用CAsyncSocket類的構(gòu)造函數(shù),創(chuàng)建一個新的空CAsyncSocket類套接字對象,構(gòu)造函數(shù)不帶參數(shù)。然后必須調(diào)用它的Create成員函數(shù),來創(chuàng)建底層的套接字數(shù)據(jù)結(jié)構(gòu),并綁定它的地址。 2創(chuàng)建異步套接字對象的底層套接字句柄通過調(diào)用CAsyncSocket類的Create()成員函數(shù),創(chuàng)建該對象的底層套接字句柄,決定套接字對象的具體特性。調(diào)用格式為:BOOL Create( UINT nSocketPort=0,Int nS
5、ocketType = SOCK_STREAM, Long Ievent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT |FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL ); 舉例:創(chuàng)建一個使用27端口的流式異步套接字對象。CAsyncSocket* pSocket = new CAsyncSocket;int nPort = 27;pSocket-Create( nPort, SOCK_STREAM ); 5.1.3 關(guān)于CAsyncSocket類可以接受并處理的消息事件1六種套接字相關(guān)的事
6、件與通知消息參數(shù)Ievent可以選用的六個符號常量是在winsock.h文件中定義的。#define FD_READ 0 x01#define FD_WRITE 0 x02#define FD_OOB 0 x04#define FD_ACCEPT 0 x08#define FD_CONNECT 0 x10#define FD_CLOSE 0 x20 他們代表MFC套接字對象可以接受并處理的六種網(wǎng)絡(luò)事件,當事件發(fā)生時,套接字對象會收到相應(yīng)的通知消息,并自動執(zhí)行套接字對象響應(yīng)的事件處理函數(shù)。(1)FD_READ事件通知:通知有數(shù)據(jù)可讀。(2)FD_WRITE事件通知:通知可以寫數(shù)據(jù)。(3)FD_A
7、CCEPT事件通知:通知監(jiān)聽套接字有連接請求可以接受。(4)FD_CONNECT事件通知:通知請求連接的套接字,連接的要求已被處理。(5)FD_CLOSE事件通知:通知套接字已關(guān)閉。(6)FD_OOB事件通知:通知將有帶外數(shù)據(jù)到達。 2MFC框架對于六個網(wǎng)絡(luò)事件的處理當上述的網(wǎng)絡(luò)事件發(fā)生時,MFC框架作何處理呢?按照Windows的消息驅(qū)動機制,MFC框架應(yīng)當把消息發(fā)送給相應(yīng)的套接字對象,并調(diào)用作為該對象成員函數(shù)的事件處理函數(shù)。事件與處理函數(shù)是一一映射的。 在afxSock.h文件中的CAsyncSocket類的聲明中,定義了與這六個網(wǎng)絡(luò)事件對應(yīng)的事件處理函數(shù)。virtual void OnR
8、eceive(int nErrorCode); 對應(yīng) FD_READ事件virtual void OnSend(int nErrorCode); 對應(yīng) FD_WRITE事件virtual void OnAccept(int nErrorCode); 對應(yīng) FD_ACCEPT事件virtual void OnConnect(int nErrorCode); 對應(yīng) FD_CONNECT事件3重載套接字對象的回調(diào)函數(shù)如果你從CAsyncSocket類派生了自己的套接字類,你必須重載你的應(yīng)用程序所感興趣的那些網(wǎng)絡(luò)事件所對應(yīng)的通知函數(shù)。MFC框架自動調(diào)用通知函數(shù),使得你可以在套接字被通知的時候來優(yōu)化套接
9、字的行為。 5.1.4 客戶端請求連接 在服務(wù)器端套接字對象已經(jīng)進入監(jiān)聽狀態(tài)之后,客戶應(yīng)用程序可以調(diào)用CAsyncSocket類的Connect()成員函數(shù),向服務(wù)器發(fā)出一個連接請求, 格式一:BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ); 格式二:BOOL Connect( const SOCKADDR* lpSockAddr,int nSockAddrLen ); 5.1.5 服務(wù)器接受請求在服務(wù)器端,使用CAsyncSocket流式套接字對象,一般按照以下步驟來接收客戶端套接字對象的連接請求。(1)服務(wù)器應(yīng)用程序必須首先創(chuàng)
10、建一個CAsyncSocket流式套接字對象,并調(diào)用它的Create成員函數(shù)創(chuàng)建底層套接字句柄。這個套接字對象專門用來監(jiān)聽來自客戶機的連接請求,所以稱它為監(jiān)聽套接字對象。 (2)調(diào)用監(jiān)聽套接字對象的Listen成員函數(shù),使監(jiān)聽套接字對象開始監(jiān)聽來自客戶端的連接請求。此函數(shù)的調(diào)用格式是:BOOL Listen( int nConnectionBacklog = 5);當Listen函數(shù)確認并接納了一個來自客戶端的連接請求后,會觸發(fā)FD_ACCEPT事件,監(jiān)聽套接字會收到通知,表示監(jiān)聽套接子已經(jīng)接納了一個客戶的連接請求,MFC框架會自動調(diào)用監(jiān)聽套接字的OnAccept事件處理函數(shù),它的原型調(diào)用格式
11、如下,virtual void OnAccept( int nErrorCode );編程者一般應(yīng)重載此函數(shù),在其中調(diào)用監(jiān)聽套接字對象的Accept函數(shù),來接收客戶端的連接請求。 (3)創(chuàng)建一個新的空的套接字對象,不需要使用它的Create函數(shù)來創(chuàng)建底層套接字句柄。這個套接字專門用來與客戶端連接,并進行數(shù)據(jù)的傳輸。一般稱它為連接套接字,并作為參數(shù)傳遞給下一步的Accept成員函數(shù)。(4)調(diào)用監(jiān)聽套接字對象的Accept成員函數(shù),調(diào)用格式為:virtual BOOL Accept( CAsyncSocket& rConnectedSocket,SOCKADDR* lpSockAddr = NUL
12、L,int* lpSockAddrLen = NULL );5.1.6 發(fā)送與接收流式數(shù)據(jù)。當服務(wù)器和客戶機建立了連接以后,就可以在服務(wù)器端的連接套接字對象和客戶端的套接字對象之間傳輸數(shù)據(jù)了。對于流式套接字對象,使用CAsyncSocket類的Send成員函數(shù)向流式套接字發(fā)送數(shù)據(jù),使用Receive成員函數(shù)從流式套接字接收數(shù)據(jù)。 1用Send成員函數(shù)發(fā)送數(shù)據(jù)格式:virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0); 對于一個CAsyncSocket套接字對象,當它的發(fā)送緩沖區(qū)騰空時,會激發(fā)FD_WRITE事件,套接
13、字會得到通知,MFC框架會自動調(diào)用這個套接字對象的OnSend事件處理函數(shù)。一般編程者會重載這個函數(shù),在其中調(diào)用Send成員函數(shù)來發(fā)送數(shù)據(jù)。 2用Receive成員函數(shù)接收數(shù)據(jù)格式: Virtual int Receive( Void* lpBuf, Int nBufLen, Int nFlags = 0); 對于一個CAsyncSocket套接字對象,當有數(shù)據(jù)到達它的接收隊列時,會激發(fā)FD_READ事件,套接字會得到已經(jīng)有數(shù)據(jù)到達的通知,MFC框架會自動調(diào)用這個套接字對象的OnReceive事件處理函數(shù)。一般編程者會重載這個函數(shù),在其中調(diào)用Receive成員函數(shù)來接收數(shù)據(jù)。在應(yīng)用程序?qū)?shù)據(jù)取
14、走之前,套接字接收的數(shù)據(jù)將一直保留在套接字的緩沖區(qū)中。 5.1.8 錯誤處理 一般說來,調(diào)用CAsyncSocket對象的成員函數(shù)后,返回一個邏輯型的值,如果成員函數(shù)執(zhí)行成功,返回TRUE;如果失敗,返回FALSE。究竟是什么原因造成錯誤呢?這時,可以進一步調(diào)用CAsyncSocket對象的GetLastError()成員函數(shù),來獲取更詳細的錯誤代碼,并進行相應(yīng)的處理。格式: static int GetLastError( );返回值是一個錯誤碼,針對剛剛執(zhí)行的CAsyncSocket成員函數(shù)。 5.1.9 其它的成員函數(shù)1關(guān)于套接字屬性的函數(shù)要設(shè)置底層套接字對象的屬性,可以調(diào)用SetSoc
15、ketOpt()成員函數(shù);要獲取套接字的設(shè)置信息,可調(diào)用GetSocketOpt()成員函數(shù);要控制套接字的工作模式,可調(diào)用IOCtl()成員函數(shù),選擇合適的參數(shù),可以將套接字設(shè)置在阻塞模式(Blocking mode)下工作。 發(fā)送數(shù)據(jù)SendTo的調(diào)用格式,有兩種重載的形式,區(qū)別在于參數(shù)不同:int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort,LPCTSTR lpszHostAddress = NULL, int nFlags = 0 );int SendTo( const void* lpBuf, int nBufLen,
16、 const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 );接收數(shù)據(jù)ReceiveFrom的調(diào)用格式,也有兩種重載的形式,區(qū)別在于參數(shù)不同:int ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );int ReceiveFrom( void* lpBuf, int nBufLen, SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFl
17、ags = 0 ); 5.2 CSocket類CSocket類是從CAsyncSocket類派生而來的,它們的派生關(guān)系如圖5.2: 圖5.2 CSocket類的派生關(guān)系 5.2.1 創(chuàng)建CSocket對象分為兩個步驟:(1)調(diào)用CSocket類的構(gòu)造函數(shù),創(chuàng)建一個空的CSocket對象。(2)調(diào)用此CSocket對象的Create()成員函數(shù),創(chuàng)建對象的底層套接字。調(diào)用格式是:BOOL Create( UINT nSocketPort = 端口號,Int nSocketPort = SOCK_STREAM | SOCK_DGRAM,LPCTSTR lpszSocketAddress = 套接字
18、所用的網(wǎng)絡(luò)地址 );如果打算使用CArchive對象和套接字一起進行數(shù)據(jù)傳輸工作,必須使用流式套接字。 5.2.2 建立連接 CSocket類使用基類CAsyncSocket的同名成員函數(shù)Connect()、Listen()、Accept()來建立服務(wù)器和客戶機套接字之間的連接,使用方法相同。不同的是:CSocket類的Connect()和Accept()支持阻塞調(diào)用。比如:在調(diào)用Connect()函數(shù)時會發(fā)生阻塞,直到成功地建立了連接或有錯誤發(fā)生才返回,在多線程的應(yīng)用程序中,一個線程發(fā)生阻塞,其他的線程仍能處理Windows事件。 5.2.3 發(fā)送和接收數(shù)據(jù)。在創(chuàng)建CSocket類對象后,對
19、于數(shù)據(jù)報套接字,直接使用CSocket類的SendTo()、ReceiveFrom()成員函數(shù)來發(fā)送和接收數(shù)據(jù)。對于流式套接字,首先在服務(wù)器和客戶機之間建立連接,然后使用CSocket類的Send()、Receive()成員函數(shù)來發(fā)送和接收數(shù)據(jù),它們的調(diào)用方式與CAsyncSocket類相同。不同的是:CSocket類的這些函數(shù)工作在阻塞的模式。比如,一旦調(diào)用了Send()函數(shù),在所有的數(shù)據(jù)發(fā)送之前,程序或線程將處于阻塞的狀態(tài)。一般將CSocket類與CArchive類和CSocketFile類結(jié)合,來發(fā)送和接收數(shù)據(jù),這將使編程更為簡單。 5.2.4 CSocket類與CArchive類和CS
20、ocketFile類使用CSocket類的最大優(yōu)點在于,應(yīng)用程序可以在連接的兩端通過CArchive對象來進行數(shù)據(jù)傳輸。具體做法是:(1)創(chuàng)建CSocket類對象(2)創(chuàng)建一個基于CSocketFile類的文件對象,并把它的指針傳給上面的已創(chuàng)建的CSocket對象。(3)分別創(chuàng)建用于輸入和輸出的CArchive對象,并將它們與這個CSocketFile文件對象連接。 (4)利用CArchive對象來發(fā)送和接收數(shù)據(jù)。 圖5.3 CSocket、CArchive和CSocketFile類在傳輸數(shù)據(jù)時的作用 下面是一段示例代碼:CSocket exSocket; / 創(chuàng)建一個空的 CSocket對象
21、。CSocketFile* pExFile; / 定義一個 CSocketFile對象指針。CArchive* pCArchiveIn; / 定義一個用于輸 入的Carchive對象指針。CArchive* pCArchiveOut;/ 定義一個用于輸 出的Carchive對象指針。exSocket.Create(); / 創(chuàng)建Csocket對象 的底層套接字。 / 創(chuàng)建CSocketFile對象,并將CSocket對象的指針傳遞給它。pExFile = new CSocketFile( & exSocket,TRUE);/創(chuàng)建用于輸入的CArchive對象pCArchiveIn = new
22、CArchive(pExFile, CArchive:load);/創(chuàng)建用于輸出的CArchive對象。pCArchiveOut = new CArchive(pExFile, CArchive:store); 5.2.5 關(guān)閉套接字和清除相關(guān)的對象,在使用完CSocket對象以后,應(yīng)用程序應(yīng)調(diào)用它的Close()成員函數(shù)來釋放套接字占用的系統(tǒng)資源,也可以調(diào)用它的ShutDown()成員函數(shù)來禁止套接字讀寫。而對于相應(yīng)的CArchive對象、CSocketFile對象和CSocket對象,可以將它們銷毀;也可以不作處理,因為當應(yīng)用程序終止時,會自動調(diào)用這些對象的析構(gòu)函數(shù),從而釋放這些對象占用的
23、資源。 5.3 CSocket類的編程模型下面給出針對流式套接字的CSocket類的編程模型。分為服務(wù)器端和客戶端。1服務(wù)器端(1)CSocket sockServ; / 創(chuàng)建空的服務(wù)器端監(jiān)聽套接字對象。/ 用眾所周知的端口,創(chuàng)建監(jiān)聽套接字對象的底層套接字句柄。(2)sockServ.Create( nPort ); (3)sockServ.Listen(); / 啟動對于客戶端連接請求的監(jiān)聽。(4)CSocket sockRecv; / 創(chuàng)建空的服務(wù)器端連接套接字對象。 / 接收客戶端的連接請求,并將其他的任務(wù)轉(zhuǎn)交給連接套接字對象。sockServ.Accept( sockRecv); (5
24、)CSockFile* file ;file = new CSockFile( &sockRecv); /創(chuàng)建文件對象并關(guān)聯(lián)到連接套接字對象。(6)CArchive* arIn, arOut;arIn = CArchive(&file, CArchive:load); / 創(chuàng)建用于輸入的歸檔對象,arOut = CArchive( &file, CArchive:store); / 創(chuàng)建用于輸出的歸檔對象。/ 歸檔對象必須關(guān)聯(lián)到文件對象。(7)arIn dwValue; / 進行數(shù)據(jù)輸入。adOut dwValue; / 進行數(shù)據(jù)輸入。adOut dwValue; / 進行數(shù)據(jù)輸出。輸入或輸出
25、可以反復進行。(7)sockClient.Close(); / 傳輸完畢,關(guān)閉套接字對象。 5.4 CAsyncSocket類的應(yīng)用實例5.4.1 實現(xiàn)目標應(yīng)用實例是一個簡單的聊天室程序,采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。由于服務(wù)器只能支持一個客戶,實際是一個點對點通信的程序。客戶端程序和服務(wù)器程序通過網(wǎng)絡(luò)交換聊天的字符串內(nèi)容,并在窗口的列表框中顯示。 實例程序的技術(shù)要點是:如何從CAsyncSocket類派生出自己的WinSock類。理解WinSock類與應(yīng)用程序框架的關(guān)系。重點學習流式套接字對象的使用。處理網(wǎng)絡(luò)事件的方法。5.4.2 創(chuàng)建客戶端應(yīng)用程序1使用MFC App
26、Wizard創(chuàng)建客戶端應(yīng)用程序框架。(1)在New對話框中,選擇Projects卡,如圖5.4所示。從左邊的列表框中選擇MFC AppWizard(exe)條目,在右邊的Project Name處填入工程名Talkc,在Location處選定存放此工程的目錄。然后點擊OK按鈕。 (2)出現(xiàn)MFC AppWizard設(shè)置的第一步對話框(MFC AppWizard Step 1),如圖5.5所示。從中選擇Dialog based的應(yīng)用程序類型,語言支持選擇中文(中國),使此工程能夠正確地進行中文的輸入、輸出、顯示及處理。然后點擊NEXT按鈕。 (3)出現(xiàn)MFC AppWizard設(shè)置的第二步對話框
27、(MFC AppWizards Step 2 of 4),如圖5.6所示,在Windows Sockets復選框上打上選擇標記,表示應(yīng)用程序?qū)⒅С諻inSock套接字。接受其它的默認設(shè)置。跳過后面的步驟,直接點擊Finsh按鈕。 (4)出現(xiàn)新工程信息對話框(New Project Information),說明了所創(chuàng)建的骨架工程的有關(guān)信息。如圖5.7所示。 從中可以看出,所創(chuàng)建的程序是一個基于對話框的Win32應(yīng)用程序,將自動創(chuàng)建兩個類,應(yīng)用程序類CTalkcApp,對應(yīng)的文件是talkc.h和talkc.cpp;對話框類CTalkcDlg,對應(yīng)的文件是talkcDlg.h和talkcDlg.
28、cpp。支持Windows Socket,使用共享的DLL實現(xiàn)MFC42.DLL。 2為對話框界面添加控件對象在創(chuàng)建了應(yīng)用程序骨架之后,可以布置程序的主對話框。在MFC界面左方的工作區(qū)(workspace)中選擇resourceView卡,從中選擇Dialog,雙擊IDD_TALKC_DIALOG,右邊會出現(xiàn)對話框,左邊會出現(xiàn)控件面板,利用控件面板可以方便地在程序的主對話框界面中添加相應(yīng)的可視控件對象,如圖5.8所示。 圖5-8 在主對話框中添加控件 完成的對話框如圖5.9所示,然后按照表5-2修改控件的屬性。 圖5-9 Talkc程序的主對話框 表5-2 Talkc程序主對話框中的控件屬性
29、控件類型控件IDCaption靜態(tài)文本 static textIDC_STATIC_SERVNAME服務(wù)器名稱靜態(tài)文本 static textIDC_STATIC_SERVPORT服務(wù)器端口靜態(tài)文本 static textIDC_STATIC_MSG消 息靜態(tài)文本 static textIDC_STATIC_SENT發(fā)送的消息靜態(tài)文本 static textIDC_STATIC_RECEIVED接收的消息編輯框 edit boxIDC_EDIT_SERVNAME編輯框 edit boxIDC_EDIT_SERVPORT編輯框 edit boxIDC_EDIT_MSG命令按鈕 buttonIDC
30、_BUTTON_CONNECT連接命令按鈕 buttonIDC_BUTTON_CLOSE斷開命令按鈕 buttonIDOK發(fā)送列表框 listboxIDC_LIST_SENT列表框 listboxIDC_LIST_RECEIVED3為對話框中的控件對象定義相應(yīng)的成員變量在窗口菜單中點查看/建立類向?qū)?,進入類向?qū)?Class Wizard)對話框,如圖5.10。 選擇成員變量卡(Member Variables),用類向?qū)閷υ捒蛑械目丶ο蠖x相應(yīng)的成員變量。確認Class Name是CTalkcDlg,在左邊的列表框中選擇一個控件,然后點“Add Variable”按鈕,會彈出”Add Me
31、mber Variable”對話框,如圖5.11所示,然后按照表5.3輸入即可。 圖5.11 增加控件成員變量的對話框 表5.3 客戶端程序?qū)υ捒蛑械目丶ο髮?yīng)的成員變量 控件IDControl IDs變量名稱Member Variable Name變量類別Category變量類型Variable TypeIDC_BUTTON_CONNECTm_btnConnectControlCButtonIDC_EDIT_SERVNAMEm_strServNameValueCStringIDC_EDIT_SERVPORTm_strServPortValueintIDC_EDIT_MSGm_strMsgV
32、alueCStringIDC_LIST_SENTm_listSentControlCListBoxIDC_LIST_RECEIVEDm_listRecetvedControlCListBox4創(chuàng)建從CAsyncSocket類繼承的派生類(1)為了能夠捕獲并響應(yīng)socket事件,應(yīng)創(chuàng)建用戶自己的套接字類,它應(yīng)當從CAsyncSocket類派生,還能將套接字事件傳遞給對話框,以便執(zhí)行用戶自己的事件處理函數(shù)。選擇菜單“插入/新建類”,進入“New Class”對話框,如圖5.12所示。 圖5.12 添加自己的套接字類 選擇或輸入以下信息:Class Type:選擇MFC ClassClass Inf
33、oumation下的Name: 輸入CMySocketClass Infoumation下的Base class:選擇CAsyncSocket點擊“OK”按鈕,系統(tǒng)會自動生成CMySocket類對應(yīng)的包含文件MySocket.h和MySocket.cpp文件,在VC界面的Class View中就可以看到這個類。 (2)利用類向?qū)lassWizard為這個套接字類添加響應(yīng)消息的事件處理成員函數(shù)。點菜單View/ClassWizard.,進入類向?qū)υ捒颍x擇Message Maps(消息映射)卡,確認Class name是CMySocket,從Messages(消息)欄中選擇事件消息,然后點擊
34、Add Function按鈕,就會看到在Member Function欄中添加了相應(yīng)的事件處理函數(shù)。如圖5.13所示,此程序中需要添加OnConnect,OnClose和OnReceive三個函數(shù)。這一步會在CMySocket類的MySocket.h中自動生成這些函數(shù)的聲明,在MySocket.cpp中生成這些函數(shù)的框架,以及消息映射的相關(guān)代碼??蓞⒖春竺娴某绦蚯鍐?。 圖5.13 為套接字類添加響應(yīng)消息的事件處理成員函數(shù) (3)為套接字類添加一般的成員函數(shù)和成員變量在VC+的界面中,在工作區(qū)窗口選擇ClassView卡,用右鍵單擊CMySocket類,會彈出快捷菜單,選擇其中的Add Memb
35、er Function 可以為該類添加成員函數(shù);選擇Add Member Variable可以為該類添加成員變量。如圖5.14所示。圖5.15和圖5.16是添加操作的對話框。對這個套接字類,添加一個私有的成員變量,是一個對話框類的指針。private:CTalkcDlg * m_pDlg;圖5.15 為套接字類添加一般的成員變量 再添加一個成員函數(shù):void SetParent(CTalkcDlg * pDlg);圖5.16 為套接字類添加一般的成員函數(shù)這一步同樣會在MySocket.h中生成變量或函數(shù)的聲明,在MySocket.cpp中生成函數(shù)的框架代碼。如果熟悉的話,這一步的代碼也可以直接
36、手工添加。 (4)手工添加其他代碼在VC+的界面中,在工作區(qū)窗口選擇FileView卡,雙擊要編輯的文件,在右面的窗口中就會展示該文件的代碼,可以編輯添加。對于MySocket.h,應(yīng)在文件開頭,添加對于此應(yīng)用程序?qū)υ捒蝾惖穆暶鳌lass CTalkcDlg;對于MySocket.cpp,有四處添加: 應(yīng)在文件開頭,添加包含文件說明。這是因為此套接字類用到了對話框類的變量。#include “TalkcDlg.h” 在構(gòu)造函數(shù)中,添加對于對話框指針成員變量的初始化代碼:CMySocket:CMySocket() m_pDlg = NULL; 在析構(gòu)函數(shù)中,添加對于對話框指針成員變量的初始化代
37、碼:CMySocket:CMySocket() m_pDlg = NULL; 為成員函數(shù)setParent和事件處理函數(shù)OnConnect,OnClose和OnReceive添加代碼。詳見后面的程序清單。 5為對話框類添加控件對象事件的響應(yīng)函數(shù)按照表5.4,用類向?qū)?Class Wizard )為對話框中的控件對象添加事件響應(yīng)函數(shù)。主要是對于三個按鈕的單擊事件的處理函數(shù),如圖5.17所示。其他函數(shù)是原有的。表5.4 為對話框中的控件對象添加事件響應(yīng)函數(shù) 控件類型對象標識 Object IDs消息 Messages函數(shù)Member functions命令按鈕IDC_BUTTON_CLOSEBN_
38、CLICKEDOnButtonClose命令按鈕IDC_BUTTON_CONNECTBN_CLICKEDOnButtonConnect命令按鈕IDOKBN_CLICKEDOnSendMsg圖5.17 為對話框類添加控件事件的處理函數(shù)這一步會在talkcDlg.h中自動添加這三個事件處理函數(shù)的聲明,在talkcDlg.cpp中生成消息映射的代碼,和這三個函數(shù)的框架代碼。 6為CTalkcDlg對話框類添加其它的成員函數(shù)和成員變量成員變量:CMySocket m_sConnectSocket; /用來與服務(wù)器端連接的套接字。成員函數(shù):void OnClose(); / 用來處理與服務(wù)器端的通信。void OnConnect();void OnReceive(); 7手工添加的代碼在CTalkcDlg對話框類的talkcDlg.h中添加對于MySocket.h的包含命令,來獲得對于套接字支持: #include “MySocket.h”在CTalkcDlg對話框類的talkcDlg.cpp中添加對
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年教育行業(yè)秋招知識時事熱點題庫
- 2026年食品安全法規(guī)與操作規(guī)范全解試題集
- 客運企業(yè)行車安全培訓
- 2026年焦作師范高等專科學校單招綜合素質(zhì)筆試備考題庫含詳細答案解析
- 2026年廣東女子職業(yè)技術(shù)學院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳細解析
- 2026年綿陽飛行職業(yè)學院單招綜合素質(zhì)考試備考試題含詳細答案解析
- 2026年安徽新聞出版職業(yè)技術(shù)學院單招綜合素質(zhì)考試模擬試題含詳細答案解析
- 2026年昆明冶金高等??茖W校單招綜合素質(zhì)筆試備考題庫含詳細答案解析
- 2026年泰州職業(yè)技術(shù)學院單招綜合素質(zhì)考試備考試題含詳細答案解析
- 2026上半年安徽事業(yè)單位聯(lián)考六安市舒城縣招聘18人考試重點試題及答案解析
- 2025年北京市物業(yè)管理行業(yè)市場深度分析及發(fā)展前景預(yù)測報告
- 旅游景區(qū)商戶管理辦法
- 2025年甘肅省中考物理、化學綜合試卷真題(含標準答案)
- DLT5210.1-2021電力建設(shè)施工質(zhì)量驗收規(guī)程第1部分-土建工程
- 機械設(shè)備租賃服務(wù)方案
- 國家職業(yè)技術(shù)技能標準 6-23-03-15 無人機裝調(diào)檢修工 人社廳發(fā)202192號
- 樂理考試古今音樂對比試題及答案
- 電影放映年度自查報告
- 水泥窯協(xié)同處置危廢可行性研究報告
- 心內(nèi)介入治療護理
- 初中畢業(yè)學業(yè)考試命題規(guī)范、原則、與教學建議
評論
0/150
提交評論