網(wǎng)絡(luò)編程實驗報告-實驗3-基于windows的MFC-windows編程_第1頁
網(wǎng)絡(luò)編程實驗報告-實驗3-基于windows的MFC-windows編程_第2頁
網(wǎng)絡(luò)編程實驗報告-實驗3-基于windows的MFC-windows編程_第3頁
網(wǎng)絡(luò)編程實驗報告-實驗3-基于windows的MFC-windows編程_第4頁
網(wǎng)絡(luò)編程實驗報告-實驗3-基于windows的MFC-windows編程_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實驗報告學(xué)院(系)名稱:計算機與通信工程學(xué)院姓名學(xué)號專業(yè)信息安全班級實驗名稱實驗3 基于windows的MFC windows編程課程名稱網(wǎng)絡(luò)編程課程代碼實驗時間2016- 12 - 5實驗地點7-219批改意見成績教師簽字: 1. 實驗?zāi)康腣C+對原來的WindowsSockets庫函數(shù)進行了一系列封裝,繼而產(chǎn)生CAsynSocket、CSocket、CSocketFile等類,它們封裝著有關(guān)Socket的各種功能。利用VC6.0中MFC AppWizard和MFC ClassWizard功能將很容易實現(xiàn)網(wǎng)絡(luò)聊天功能2. 實驗環(huán)境搭載 Windows 7 操作系統(tǒng)的

2、PC機VC 6.0 編譯器3. 實驗要求編寫基于windows的MFC windows的可進行socket通信的程序4. 實驗過程記錄(源程序、測試用例、測試結(jié)果及心得體會等)1.建立基于對話框的MFC 工程MySock注意:基于對話框;支持window socket。1. 添加控件,并設(shè)置控件屬性控件類型IDCaptionGroup BoxIDC_STATICsocket類型Radio ButtonIDC_RCLIENT客戶端RadioButtonIDC_RSERVER服務(wù)器端Static textIDC_SNAME服務(wù)器名Edit boxIDC_ESERVERNAMEStatic text

3、IDC_SPORT端口號Edit boxIDC_EPORTButtonIDC_BCONNECT連接ButtonIDC_BCLOSE關(guān)閉Static boxIDC_SMSG消息Edit boxIDC_EMSGStatic boxIDC_SSEND發(fā)送List boxIDC_LSENDStatic boxIDC_SRECV接收List boxIDC_LRECVButtonIDC_BSEND發(fā)送3.為控件添加對應(yīng)的成員變量和映射消息響應(yīng)函數(shù)雙擊“發(fā)送”按鈕,添加OnBsend 函數(shù);雙擊“關(guān)閉”按鈕,添加OnBclose 函數(shù);復(fù)用“連接”按鈕,當(dāng)選擇客戶端按鈕時顯示“連接”;當(dāng)選擇服務(wù)端時顯示“監(jiān)

4、聽”。為兩個單選按鈕添加一個消息函數(shù), 根據(jù)當(dāng)前選擇的按鈕修改命令的正文。具體做法是,雙擊IDC_RCLIENT 控件,添加函數(shù)OnRType 函數(shù),同時雙擊IDC_RSERVER 控件,添加該函數(shù)。編輯該函數(shù),添加如下代碼:/in MySockDlg.cppvoid CMySockDlg:OnRType()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /使控件與變量同步if(m_iType=0) /m_iType=0 即client 端m_ctlConnect.SetWindowText(&q

5、uot;連接");/m_ctlConnect 為控件“連接”按鈕的映射變量elsem_ctlConnect.SetWindowText("監(jiān)聽");運行程序,結(jié)果如下圖所示:選中“客戶端”顯示“連接”;選中“服務(wù)器端”顯示“監(jiān)聽”:4.添加CAsyncSocket 類的繼承類MySocket為了使應(yīng)用程序能夠捕捉和相應(yīng)socket 事件,可以從AsyncSocket 創(chuàng)建自己的派生類。該類需要有自己版本的事件函數(shù),也需要一種把此事件傳到對話框的方法。為把每個事件傳給對話框類、添加一個指向父對話框的指針作為socket 類的成員變量。對每個socket 事件使用此指

6、針調(diào)用事件函數(shù)。具體做法, 如圖所示:創(chuàng)建socket 類后,為該類添加一個私有成員變量m_pWnd 作為指向父對話框的指針;然后必須在該類中,添加一個成員函數(shù)SetParent 以設(shè)置該指針,該函數(shù)在MySocket.cpp 文件中的實現(xiàn)代碼為:void CMySocket:SetParent(CDialog* pWnd)m_pWnd=pWnd;/設(shè)置成員指針變量最后,MySocket 類,還必須添加事件函數(shù),用于調(diào)用對話框類中名字相同的成員函數(shù)。為添加OnAccept 事件函數(shù),可以ClassWizard 窗口中,單擊右鍵|add virtual function注意:同時添加#inclu

7、de "MySocket.h"5.初始化CMySocket 類的成員函數(shù)添加CMySocket 變量后,添加所有變量的初始化代碼。默認(rèn)設(shè)置為:應(yīng)用程序類型設(shè)置為客戶端程序,服務(wù)器名為loopback,端口為4000,在兩個CMySocket 對象中設(shè)置父對話框的指針,指向?qū)υ捒蝾悓ο蟆K羞@些初始化,都在OnInitDialog 函數(shù)中完成。注意:計算機名loopback 是TCP/IP 網(wǎng)絡(luò)協(xié)議的一個特殊名字,表示你正在這臺計算機上工作,這個內(nèi)部計算機名網(wǎng)址為127.0.0.1。需要與另一個程序連接,運行在同一臺計算機上的應(yīng)用程序都用此名字和網(wǎng)址。/ in MySockD

8、lg.cppBOOL CMySockDlg:OnInitDialog()/省略代碼(自動生成的)/ TODO: Add extra initialization here/初始化控件對應(yīng)的變量m_iType = 0;m_strName ="loopback"m_iPort = 4000;/更新控件UpdateData(FALSE);/設(shè)置Socket 對應(yīng)的對話框m_sConnectSocket.SetParent(this);m_sListenSocket.SetParent(this);return TRUE; 5.實現(xiàn)客戶端與服務(wù)端間的連接功能用戶單擊“連接”按鈕后,

9、就禁止了對話框上頂端的所有控件,此時,用戶不可修改對方計算機的設(shè)置或修改應(yīng)用程序的監(jiān)聽方式。可以調(diào)用Create 函數(shù),其Socket 變量根據(jù)應(yīng)用程序運行在客戶機或服務(wù)器上而定。最后調(diào)用Connect 或Listen 函數(shù)初始化應(yīng)用程序端的連接。給應(yīng)用程序添加如上功能,可以給“連接”按鈕,ID 為IDC_BCONNECT,添加單擊響應(yīng)事件函數(shù),或者雙擊“連接”按鈕,進入編輯代碼。/in MySockDlg.cppvoid CMySockDlg:OnBconnect()/ TODO: Add your control notification handler code here/使變量與控件同

10、步UpdateData(TRUE);/使連接和類型控件無效GetDlgItem(IDC_BCONNECT)->EnableWindow(FALSE);GetDlgItem(IDC_ESERVERNAME)->EnableWindow(FALSE);GetDlgItem(IDC_EPORT)->EnableWindow(FALSE);GetDlgItem(IDC_RCLIENT)->EnableWindow(FALSE);GetDlgItem(IDC_RSERVER)->EnableWindow(FALSE);/作為客戶端還是服務(wù)器端?if(m_iType = 0)

11、m_sConnectSocket.Create();/客戶端,則創(chuàng)建缺省的Socketm_sConnectSocket.Connect(m_strName,m_iPort);/打開與服務(wù)器的連接elsem_sListenSocket.Create(m_iPort);/服務(wù)器端,則創(chuàng)建一個與制定端口號相關(guān)聯(lián)的socketm_sListenSocket.Listen();/監(jiān)聽連接請求為完成此連接,要為對話框類的OnAccept 和OnConnect 函數(shù)添加socket 事件函數(shù)。這些函數(shù)都是Socket 類調(diào)用的,不需要任何參數(shù),也不必返回任何結(jié)果。其中OnAccept 函數(shù)是在對方應(yīng)用程序試

12、圖連接正在監(jiān)聽的Socket 時調(diào)用,將調(diào)用Socket 對象的Accept 函數(shù),傳入連接Sock 變量。當(dāng)接受連接后,可以啟用提示符和編輯框、輸入和發(fā)送消息給對方應(yīng)用程序。實現(xiàn)把該函數(shù)添加給應(yīng)用程序,應(yīng)在對話類CMySockDlg 類添加一個共有訪問成員函數(shù):(void)OnAccept,并編輯此函數(shù),添加實現(xiàn)代碼。具體做法是,在classview 窗口中,CMySockDlg 類上單擊右鍵,選擇Add member function添加完成后,在MySockDlg.h 文件的類定義中,會出現(xiàn)OnAccept 函數(shù)的聲明,同時MySockDlg.cpp 文件中也會出現(xiàn)該函數(shù)相應(yīng)的代碼框架,

13、只需直接在函數(shù)體中加入實現(xiàn)代碼即可。/in MySockDlg.hclass CMySockDlg : public CDialogpublic:void OnAccept();/省略代碼;/in MySockDlg.cppvoid CMySockDlg:OnAccept()/接受連接請求m_sListenSocket.Accept(m_sConnectSocket);/是文本和消息控件有效GetDlgItem(IDC_EMSG)->EnableWindow( TRUE);GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);GetDlgItem(ID

14、C_SMSG)->EnableWindow(TRUE);客戶端,連接完成后只需使用消息輸入和發(fā)送控件,還應(yīng)使用close 按鈕關(guān)閉客戶機端的連接。同樣的方法給對話框類CMySockDlg 添加公有成員函數(shù)(void)OnConnect。/in MySockDlg.cppvoid CMySockDlg:OnConnect()/使文本和消息控件有效GetDlgItem(IDC_EMSG)->EnableWindow( TRUE);GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);GetDlgItem(IDC_SMSG)->EnableWin

15、dow(TRUE);GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);此時,對話框類CMySockDlg 還缺少幾個函數(shù),按照上述方法,依次添加公有訪問方式、void 類型的函數(shù)OnSend、OnReceive、OnClose,這幾個函數(shù)的具體實現(xiàn)代碼后面添加。到此,就可以編譯和運行程序了。編譯后,同時可以啟動兩份拷貝,一份作為服務(wù)器端,單擊“監(jiān)聽”按鈕設(shè)置為監(jiān)聽模式;另一個作為客戶端,單擊“連接”按鈕與服務(wù)器連接。連接后,連接控件被禁用,消息發(fā)送控件被啟用。7.實現(xiàn)客戶端與服務(wù)器端間的消息收發(fā)功能實現(xiàn)了應(yīng)用程序的連接后,下面是實現(xiàn)消息的收發(fā)功能,即使

16、用戶能夠在對話框的編輯框中輸入文本信息,然后單擊“發(fā)送”按鈕將消息發(fā)送給對方程序。發(fā)送后,正文添加到已發(fā)送消息的列表中。實現(xiàn)上述功能,需要在單擊“發(fā)送”按鈕后,應(yīng)用程序檢查是否有發(fā)送的消息,求取消息的長度,發(fā)送此消息,并把消息添加到已發(fā)送的列表框中。把此項功能添加到應(yīng)用程序,需要雙擊“發(fā)送”按鈕,添加一個消息函數(shù)OnBsend,并為此函數(shù)添加相關(guān)代碼。我們讓該函數(shù)調(diào)用對話框類的成員函數(shù)OnSend./in Mysockdlg.cppvoid CMySockDlg:OnSend()int iLen;int iSent;/使控件與變量同步UpdateData(TRUE);/是否有信息要發(fā)送?if(

17、m_strMessage != "")/獲取消息的長度iLen = m_strMessage.GetLength();/發(fā)送消息iSent = m_sConnectSocket.Send(LPCSTR(m_strMessage),iLen);if(iSent = SOCKET_ERROR)/是否發(fā)送成功/錯誤處理代碼else/把消息添加到已發(fā)送列表中m_ctlSend.AddString(m_strMessage);/把控件與變量同步UpdateData(FALSE);void CMySockDlg:OnBsend()OnSend();OnReceive 事件被激發(fā)時表示消

18、息已經(jīng)到達,可使用Receive 函數(shù)從Socket 接收信息,接收后將其轉(zhuǎn)化成CString 類型的數(shù)據(jù)并把它添加到消息接收列表框中。對話框類的OnReceive函數(shù),實現(xiàn)此功能,過程類似于上述。為CMySockDlg 類添加成員函數(shù)OnReceive(即上一節(jié)中已經(jīng)添加過),并添加代碼:/in Mysockdlg.cppvoid CMySockDlg:OnReceive()char *pBuf = new char1025;int iBufSize = 1024;int iRcvd;CString strRecv;/接收消息iRcvd = m_sConnectSocket.Receive(pBuf,iBufSize);if(iRcvd = SOCKET_ERROR)/錯誤處理代碼elsepBufiRcvd = NULL;/對信息進行結(jié)尾處理strRecv = pBuf;/復(fù)制接收到的消息CString 類型的變量中m_ctlRecv.AddString(strRecv);/增加信息到接收的列表框中UpdateData(FALSE);/使變量與控件同步8.添加終止連接的代碼void CMySockDlg:OnClose() m_sConnectSocket.Clo

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論