




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、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 對象代表了一個Window
2、s套接字。它是網(wǎng)絡(luò) 通信的端點。除了把套接字封裝成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類為Windo
3、ws消息的后臺處理 提供了阻塞的工作模式。 這兩個類提供了事件處理函數(shù),編程者通過 對事件處理函數(shù)進行重載,可方便地對套接字 發(fā)送數(shù)據(jù)、接收數(shù)據(jù)等事件進行處理。同時, 可以結(jié)合MFC的其它類來使用這兩個套接字類, 并利用MFC的各種可視化向?qū)?,從而大大簡?了編程。 在MFC中,有一個名為afxSock.h的包含 文件,在這個文件中定義了CAsyncSocket, CSocket,和CSocketFile這三個套接字類。 CasyncSocket類類 CAsyncSocket類從Cobject類派生而來,如圖1所示: 圖1 CAsyncSocket類的派生關(guān)系 創(chuàng)建創(chuàng)建CasyncSocket
4、類對象類對象 本書將CAsyncSocket類對象稱為異步套接 字對象。創(chuàng)建異步套接字對象一般分為兩個步 驟,首先構(gòu)造一個CAsyncSocket對象,再創(chuàng) 建該對象的底層的SOCKET句柄。 1創(chuàng)建空的異步套接字對象創(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),并 綁定它的地址。 有兩種使用方法,會在不同的位置創(chuàng)建。 (1)如:CAsyncSocket aa; aa.Create(。); (2)如: CAsyncSocket*
5、Pa; Pa = new CAsyncSocket; Pa-Create(。); 2創(chuàng)建異步套接字對象的底層套接字句柄創(chuàng)建異步套接字對象的底層套接字句柄 通過調(diào)用CAsyncSocket類的Create()成員函數(shù), 創(chuàng)建該對象的底層套接字句柄,決定套接字對象的具 體特性。調(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 lpszSoc
6、ketAddress = NULL ); 舉例:創(chuàng)建一個使用27端口的流式異步套接 字對象。 CAsyncSocket* pSocket = new CAsyncSocket; int nPort = 27; pSocket-Create( nPort, SOCK_STREAM ); 關(guān)于關(guān)于CAsyncSocket類可以接受并處理的消息事件類可以接受并處理的消息事件 1六種套接字相關(guān)的事件與通知消息六種套接字相關(guān)的事件與通知消息 參數(shù)Ievent可以選用的六個符號常量是在winsock.h 文件中定義的。 #define FD_READ 0 x01 #define FD_WRITE 0 x0
7、2 #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_ACCEPT事件通知:通知監(jiān)聽套接字有 連接請求可以接受。 (4)FD_CONNECT事件通知:通知請求連接的 套接字,連接的要求已被處理。 (5)FD
8、_CLOSE事件通知:通知套接字已關(guān)閉。 (6)FD_OOB事件通知:通知將有帶外數(shù)據(jù)到達。 2MFC框架對于六個網(wǎng)絡(luò)事件的處理框架對于六個網(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 OnReceive(int nErrorCode); 對應(yīng) FD_READ事件 virtual void
9、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事件 virtual void OnClose(int nErrorCode); 對應(yīng) FD_CLOSE事件 virtual void OnOutOfBandData(int nErrorCode); 對應(yīng) FD_OOB事件 當某個網(wǎng)絡(luò)事件發(fā)生時,MFC框架會自動 調(diào)用套接字對象的對應(yīng)的事件處理函數(shù)。這 就相
10、當給了套接字對象一個通知,告訴它某 個重要的事件已經(jīng)發(fā)生。所以也稱之為套接 字類的通知函數(shù)(notification functions) 或回調(diào)函數(shù)(callback functions)。 3重載套接字對象的回調(diào)函數(shù)重載套接字對象的回調(diào)函數(shù) 如果你從CAsyncSocket類派生了自己的套接 字類,你必須重載你的應(yīng)用程序所感興趣的那 些網(wǎng)絡(luò)事件所對應(yīng)的通知函數(shù)。 MFC框架自動調(diào)用通知函數(shù),使得你可以在套 接字被通知的時候來優(yōu)化套接字的行為。 客戶端套接字對象請求連接到服務(wù)器端客戶端套接字對象請求連接到服務(wù)器端 在服務(wù)器端套接字對象已經(jīng)進入監(jiān)聽狀態(tài) 之 后 , 客 戶 應(yīng) 用 程 序 可
11、以 調(diào) 用 CAsyncSocket類的Connect()成員函數(shù), 向服務(wù)器發(fā)出一個連接請求, 格式一:BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ); 格式二:BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen ); 如果調(diào)用成功或者發(fā)生了 WSAEWOULDBLOCK錯誤,當調(diào)用結(jié)束返回 時,都會發(fā)生FD_CONNECT事件,MFC框架 會自動調(diào)用客戶端套接字的OnConnect()事 件處理函數(shù),并將錯誤代碼作為參數(shù)傳送給它。 它的原型調(diào)用格式如下, vir
12、tual void OnConnect( int nErrorCode ); 服務(wù)器接受客戶機的連接請求服務(wù)器接受客戶機的連接請求 在服務(wù)器端,使用CAsyncSocket流式套接字 對象,一般按照以下步驟來接收客戶端套接字 對象的連接請求。 (1)服務(wù)器應(yīng)用程序必須首先創(chuàng)建一個 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(
13、int nConnectionBacklog = 5); 當Listen函數(shù)確認并接納了一個來自客戶端的連接 請求后,會觸發(fā)FD_ACCEPT事件,監(jiān)聽套接字會收 到通知,表示監(jiān)聽套接子已經(jīng)接納了一個客戶的連接 請求,MFC框架會自動調(diào)用監(jiān)聽套接字的OnAccept 事件處理函數(shù),它的原型調(diào)用格式如下, virtual void OnAccept( int nErrorCode ); 編程者一般應(yīng)重載此函數(shù),在其中調(diào)用監(jiān)聽套接字對 象的Accept函數(shù),來接收客戶端的連接請求。 (3)創(chuàng)建一個新的空的套接字對象,不需要使用它 的Create函數(shù)來創(chuàng)建底層套接字句柄。這個套接字 專門用來與客戶端
14、連接,并進行數(shù)據(jù)的傳輸。一般稱 它為連接套接字,并作為參數(shù)傳遞給下一步的 Accept成員函數(shù)。 (4)調(diào)用監(jiān)聽套接字對象的Accept成員函數(shù),調(diào) 用格式為: virtual BOOL Accept( CAsyncSocket 發(fā)送與接收流式數(shù)據(jù)發(fā)送與接收流式數(shù)據(jù) 當服務(wù)器和客戶機建立了連接以后,就可以 在服務(wù)器端的連接套接字對象和客戶端的套 接字對象之間傳輸數(shù)據(jù)了。對于流式套接字 對象,使用CAsyncSocket類的Send成員函 數(shù)向流式套接字發(fā)送數(shù)據(jù),使用Receive成 員函數(shù)從流式套接字接收數(shù)據(jù)。 1用用Send成員函數(shù)發(fā)送數(shù)據(jù)成員函數(shù)發(fā)送數(shù)據(jù) 格式:virtual int Se
15、nd( const void* lpBuf, int nBufLen, int nFlags = 0); 對于一個CAsyncSocket套接字對象,當 它的發(fā)送緩沖區(qū)騰空時,會激發(fā)FD_WRITE 事件,套接字會得到通知,MFC框架會自動 調(diào)用這個套接字對象的OnSend事件處理函數(shù)。 一般編程者會重載這個函數(shù),在其中調(diào)用 Send成員函數(shù)來發(fā)送數(shù)據(jù)。 2用用Receive成員函數(shù)接收數(shù)據(jù)成員函數(shù)接收數(shù)據(jù) 格式: Virtual int Receive( Void* lpBuf, Int nBufLen, Int nFlags = 0); 對于一個CAsyncSocket套接字對象,當有 數(shù)
16、據(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ù)取走之前,套接字 接收的數(shù)據(jù)將一直保留在套接字的緩沖區(qū)中。 關(guān)閉套接字關(guān)閉套接字 1使用使用CAsyncSocket類的類的Close成員函成員函 數(shù)數(shù) 格式:virtual void Close( ); 2使用使用CAsyncSocket類的類的ShutDown() 成員函數(shù)成員函數(shù) 使用CAsyncSocket類的ShutDown()成員 函數(shù),可
17、以選擇關(guān)閉套接字的方式。將套接字 置為不能發(fā)送數(shù)據(jù),或不能接收數(shù)據(jù),或二者 均不能的狀態(tài)。 格式:BOOL ShutDown( int nHow = sends ); 錯誤處理錯誤處理 一般說來,調(diào)用CAsyncSocket對象的成員函數(shù)后, 返回一個邏輯型的值,如果成員函數(shù)執(zhí)行成功,返回 TRUE;如果失敗,返回FALSE。究竟是什么原因造 成錯誤呢?這時,可以進一步調(diào)用CAsyncSocket對 象的GetLastError()成員函數(shù),來獲取更詳細的錯誤 代碼,并進行相應(yīng)的處理。 格式: static int GetLastError( ); 返回值是一個錯誤碼,針對剛剛執(zhí)行的 CAsy
18、ncSocket成員函數(shù)。 其它的成員函數(shù)其它的成員函數(shù) 1關(guān)于套接字屬性的函數(shù)關(guān)于套接字屬性的函數(shù) 要 設(shè) 置 底 層 套 接 字 對 象 的 屬 性 , 可 以 調(diào) 用 SetSocketOpt()成員函數(shù); 要獲取套接字的設(shè)置信息,可調(diào)用GetSocketOpt() 成員函數(shù); 要控制套接字的工作模式,可調(diào)用IOCtl()成員函數(shù), 選擇合適的參數(shù),可以將套接字設(shè)置在阻塞模式 (Blocking mode)下工作。 2發(fā)送和接收數(shù)據(jù)發(fā)送和接收數(shù)據(jù) 如果創(chuàng)建的是數(shù)據(jù)報類型的套接字,用 SendTo()成員函數(shù)來向指定的地址發(fā)送數(shù)據(jù), 事先不需要建立發(fā)送端和接收端之間的連接, 用Receiv
19、eFrom()成員函數(shù)可以從某個指定的 網(wǎng)絡(luò)地址接收數(shù)據(jù)。 發(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, const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 ); 應(yīng)用實例是一個簡單的聊天室程序,
20、采用 客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器 端程序。由于服務(wù)器只能支持一個客戶,實際 是一個點對點通信的程序??蛻舳顺绦蚝头?wù) 器程序通過網(wǎng)絡(luò)交換聊天的字符串內(nèi)容,并在 窗口的列表框中顯示。 實例程序的技術(shù)要點是: 如何從CAsyncSocket類派生出自己的 WinSock類。 理解WinSock類與應(yīng)用程序框架的關(guān)系。 重點學(xué)習(xí)流式套接字對象的使用。 處理網(wǎng)絡(luò)事件的方法。 創(chuàng)建客戶端應(yīng)用程序創(chuàng)建客戶端應(yīng)用程序 1使用使用MFC AppWizard創(chuàng)建客戶端應(yīng)用程序框架。創(chuàng)建客戶端應(yīng)用程序框架。 (1)在New對話框中,選擇Projects卡,如圖4所示。從左邊 的列表框中選擇MFC A
21、ppWizard(exe)條目,在右邊的 Project Name處填入工程名Talkc,在Location處選定存放此 工程的目錄。然后點擊OK按鈕。 (2)出現(xiàn)MFC AppWizard設(shè)置的第一步對話框(MFC AppWizard Step 1),如圖5所示。從中選擇Dialog based的應(yīng)用程序類型,語言支持 選擇中文(中國),使此工程能夠正確地進行中文的輸入、輸出、顯示及處 理。然后點擊NEXT按鈕。 (3)出現(xiàn)MFC AppWizard設(shè)置的第二步對話框(MFC AppWizards Step 2 of 4),如圖6所示,在Windows Sockets復(fù)選框上打上選擇標記,表
22、示應(yīng)用 程序?qū)⒅С諻inSock套接字。接受其它的默認設(shè)置。跳過后面的步驟,直接點 擊Finsh按鈕。 (4)出現(xiàn)新工程信息對話框(New Project Information),說明了所創(chuàng)建 的骨架工程的有關(guān)信息。如圖7所示。 從中可以看出,所創(chuàng)建的程序是一個基于對話框的Win32應(yīng)用程序,將自動 創(chuàng)建兩個類,應(yīng)用程序類CTalkcApp,對應(yīng)的文件是talkc.h和talkc.cpp; 對話框類CTalkcDlg,對應(yīng)的文件是talkcDlg.h和talkcDlg.cpp。支持 Windows Socket,使用共享的DLL實現(xiàn)MFC42.DLL。 2為對話框界面添加控件對象為對話框界面
23、添加控件對象 在創(chuàng)建了應(yīng)用程序骨架之后,可以布置程序的主對 話框。在MFC界面左方的工作區(qū)(workspace) 中選擇resourceView卡,從中選擇Dialog,雙擊 IDD_TALKC_DIALOG,右邊會出現(xiàn)對話框,左 邊會出現(xiàn)控件面板,利用控件面板可以方便地在程 序的主對話框界面中添加相應(yīng)的可視控件對象,如 圖8所示。 圖8 在主對話框中添加控件 完成的對話框如圖9所示,然后按照表2修改控件的屬性。 圖9 Talkc程序的主對話框 表2 Talkc程序主對話框中的控件屬性表 控件類型控件IDCaption 靜態(tài)文本 static textIDC_STATIC_SERVNAME服務(wù)
24、器名稱 靜態(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_BUTTON_CONNECT連接 命令按鈕 buttonIDC_BUTTON_CLOS
25、E斷開 命令按鈕 buttonIDOK發(fā)送 列表框 listboxIDC_LIST_SENT 列表框 listboxIDC_LIST_RECEIVED 3為對話框中的控件對象定義相應(yīng)的成員變量為對話框中的控件對象定義相應(yīng)的成員變量 在窗口菜單中點查看/建立類向?qū)?,進入類向?qū)?Class Wizard) 對話框,如圖10。 選擇成員變量卡(Member Variables),用類向?qū)閷υ捒?中的控件對象定義相應(yīng)的成員變量。確認Class Name是 CTalkcDlg,在左邊的列表框中選擇一個控件,然后點“Add Variable”按鈕,會彈出”Add Member Variable”對話框,
26、 如圖11所示,然后按照表3輸入即可。 圖11 增加控件成 員變量的對話框 表3 客戶端程序?qū)υ捒蛑械目丶ο髮?yīng)的成員變量 控件ID Control IDs 變量名稱Member Variable Name 變量類別 Category 變量類型 Variable Type IDC_BUTTON_CONNECTm_btnConnectControlCButton IDC_EDIT_SERVNAMEm_strServNameValueCString IDC_EDIT_SERVPORTm_strServPortValueint IDC_EDIT_MSGm_strMsgValueCString ID
27、C_LIST_SENTm_listSentControlCListBox IDC_LIST_RECEIVEDm_listRecetvedControlCListBox 4創(chuàng)建從創(chuàng)建從CAsyncSocket類繼承的派生類類繼承的派生類 (1)為了能夠捕獲并響應(yīng)socket事件,應(yīng)創(chuàng)建用戶自己的套接字類,它應(yīng) 當從CAsyncSocket類派生,還能將套接字事件傳遞給對話框,以便執(zhí)行用 戶自己的事件處理函數(shù)。選擇菜單“插入/新建類”,進入“New Class” 對話框,如圖12所示。 圖12 添加自己的 套接字類 選擇或輸入以下信息: Class Type:選擇MFC Class Class I
28、nfoumation下的Name: 輸入CMySocket Class 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(消息)欄中
29、選擇事件消息,然后點擊Add Function按鈕,就會 看到在Member Function欄中添加了相應(yīng)的事件 處理函數(shù)。如圖13所示,此程序中需要添加 OnConnect,OnClose和OnReceive三個函數(shù)。 這一步會在CMySocket類的MySocket.h中自動生 成這些函數(shù)的聲明,在MySocket.cpp中生成這些 函數(shù)的框架,以及消息映射的相關(guān)代碼??蓞⒖春?面的程序清單。 圖13 為套接字類添加響應(yīng)消息的事件處理成員函數(shù) (3)為套接字類添加一般的成員函數(shù)和成員變量 在VC+的界面中,在工作區(qū)窗口選擇ClassView卡,用右鍵 單擊CMySocket類,會彈出快捷
30、菜單,選擇其中的Add Member Function 可以為該類添加成員函數(shù);選擇Add Member Variable可以為該類添加成員變量。如圖14所示。 圖15和圖16是添加操作的對話框。 對這個套接字類,添加一個私有的成員變量,是一個對話框類 的指針。 private: CTalkcDlg * m_pDlg; 圖15 為套接字類添加一般的成員變量 再添加一個成員函數(shù):void SetParent(CTalkcDlg * pDlg); 圖16 為套接字類添加一般的成員函數(shù) 這一步同樣會在MySocket.h中生成變量或函數(shù)的聲明,在 MySocket.cpp中生成函數(shù)的框架代碼。如果熟
31、悉的話,這 一步的代碼也可以直接手工添加。 (4)手工添加其他代碼 在VC+的界面中,在工作區(qū)窗口選擇FileView卡,雙擊要編 輯的文件,在右面的窗口中就會展示該文件的代碼,可以編輯 添加。 對于MySocket.h,應(yīng)在文件開頭,添加對于此應(yīng)用程序?qū)υ?框類的聲明。 class CTalkcDlg; 對于MySocket.cpp,有四處添加: 應(yīng)在文件開頭,添加包含文件說明。這是因為此套接字類用 到了對話框類的變量。 #include “TalkcDlg.h” 在構(gòu)造函數(shù)中,添加對于對話框指針成員變量的初始化代碼: CMySocket:CMySocket() m_pDlg = NULL;
32、 在析構(gòu)函數(shù)中,添加對于對話框指針成員變量的初始化代碼: CMySocket:CMySocket() m_pDlg = NULL; 為成員函數(shù)setParent和事件處理函數(shù)OnConnect, OnClose和OnReceive添加代碼。詳見后面的程序清單。 5為對話框類添加控件對象事件的響應(yīng)函數(shù)為對話框類添加控件對象事件的響應(yīng)函數(shù) 按照表4,用類向?qū)?Class Wizard )為對話框中的控件對象添加 事件響應(yīng)函數(shù)。主要是對于三個按鈕的單擊事件的處理函數(shù),如 圖17所示。其他函數(shù)是原有的。 表4 為對話框中的控件對象添加事件響應(yīng)函數(shù) 控件類型對象標識 Object IDs消息 Messa
33、ges函數(shù)Member functions 命令按鈕IDC_BUTTON_CLOSEBN_CLICKEDOnButtonClose 命令按鈕IDC_BUTTON_CONNE CT BN_CLICKEDOnButtonConnect 命令按鈕IDOKBN_CLICKEDOnSendMsg 圖17 為對話框類添加控件事件的處理函數(shù) 這一步會在talkcDlg.h中自動添加這三個事件處理函數(shù)的聲明, 在talkcDlg.cpp中生成消息映射的代碼,和這三個函數(shù)的框架 代碼。 6為為CTalkcDlg對話框類添加其它的成員函數(shù)和成員變量對話框類添加其它的成員函數(shù)和成員變量 成員變量:CMySocket
34、 m_sConnectSocket; /用來與服 務(wù)器端連接的套接字。 成員函數(shù):void OnClose(); / 用來處理與服務(wù)器端的通 信。 void OnConnect(); void OnReceive(); 7手工添加的代碼手工添加的代碼 在CTalkcDlg對話框類的talkcDlg.h中添加對于MySocket.h的 包含命令,來獲得對于套接字支持: #include “MySocket.h” 在CTalkcDlg對話框類的talkcDlg.cpp中添加對于控件變量的初 始化代碼: / TODO: Add extra initialization here /用戶添加的控件變量的初始化代碼 BOOL CTalkcDlg:OnInitDialog() m_strServName=localhost; / 服務(wù)器名 = localhost m_nServPort=1000; / 服務(wù)端口 = 1000 UpdateData(FALSE); / 更新用戶界面 /設(shè)置套接字類的對話框指針成員變量 m_sConnectSocket.SetParent(this); 8添加事件函數(shù)和成員函數(shù)的代碼添加事件函數(shù)和成員函數(shù)的代碼 主要在CTalkcDlg對話框類的talkcDlg.cpp中和CMySocket 類的Mysocket.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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑勞務(wù)清包合同
- 園林綠化工程施工合同
- 展廳裝修施工合同協(xié)議書
- 中介房屋買賣合同大全年
- 醫(yī)療健康領(lǐng)域醫(yī)療資源分布統(tǒng)計表
- 導(dǎo)購員聘用合同協(xié)議書
- 2025年潮州貨運上崗證模擬考試0題
- 2025年部編版小學(xué)三年級下冊課外閱讀專項復(fù)習(xí)題(有答案)
- ic芯片購銷合同范本
- 制動氣室市場分析及競爭策略分析報告
- 一年級美術(shù)課后輔導(dǎo)方案-1
- 新法律援助基礎(chǔ)知識講座
- 《鍛造安全生產(chǎn)》課件
- 小學(xué)數(shù)學(xué)1-6年級(含奧數(shù))找規(guī)律專項及練習(xí)題附詳細答案
- 《同濟大學(xué)簡介》課件
- 《建筑攝影5構(gòu)》課件
- 機電安裝工程質(zhì)量控制
- 愛自己是終身浪漫的開始 心理課件
- 新房房屋買賣合同
- 地鐵出入口雨棚施工工藝
- 人工智能引論智慧樹知到課后章節(jié)答案2023年下浙江大學(xué)
評論
0/150
提交評論