网络编程实验报告-实验3-基于windows的MFC-windows编程_第1页
网络编程实验报告-实验3-基于windows的MFC-windows编程_第2页
网络编程实验报告-实验3-基于windows的MFC-windows编程_第3页
网络编程实验报告-实验3-基于windows的MFC-windows编程_第4页
网络编程实验报告-实验3-基于windows的MFC-windows编程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验报告学院(系)名称:计算机与通信工程学院姓名学号专业信息安全班级实验名称实验3 基于windows的MFC windows编程课程名称网络编程课程代码0662146实验时间2016- 12 - 5实验地点7-219批改意见成绩教师签字: 1. 实验目的VC+对原来的WindowsSockets库函数进行了一系列封装,继而产生CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能。利用VC6.0中MFC AppWizard和MFC ClassWizard功能将很容易实现网络聊天功能2. 实验环境搭载 Windows 7 操作系统的PC机VC

2、6.0 编译器3. 实验要求编写基于windows的MFC windows的可进行socket通信的程序4. 实验过程记录(源程序、测试用例、测试结果及心得体会等)1.建立基于对话框的MFC 工程MySock注意:基于对话框;支持window socket。1. 添加控件,并设置控件属性控件类型IDCaptionGroup BoxIDC_STATICsocket类型Radio ButtonIDC_RCLIENT客户端RadioButtonIDC_RSERVER服务器端Static textIDC_SNAME服务器名Edit boxIDC_ESERVERNAMEStatic textIDC_SP

3、ORT端口号Edit boxIDC_EPORTButtonIDC_BCONNECT连接ButtonIDC_BCLOSE关闭Static boxIDC_SMSG消息Edit boxIDC_EMSGStatic boxIDC_SSEND发送List boxIDC_LSENDStatic boxIDC_SRECV接收List boxIDC_LRECVButtonIDC_BSEND发送3.为控件添加对应的成员变量和映射消息响应函数双击“发送”按钮,添加OnBsend 函数;双击“关闭”按钮,添加OnBclose 函数;复用“连接”按钮,当选择客户端按钮时显示“连接”;当选择服务端时显示“监听”。为两个

4、单选按钮添加一个消息函数, 根据当前选择的按钮修改命令的正文。具体做法是,双击IDC_RCLIENT 控件,添加函数OnRType 函数,同时双击IDC_RSERVER 控件,添加该函数。编辑该函数,添加如下代码:/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(连接);/m_c

5、tlConnect 为控件“连接”按钮的映射变量elsem_ctlConnect.SetWindowText(监听);运行程序,结果如下图所示:选中“客户端”显示“连接”;选中“服务器端”显示“监听”:4.添加CAsyncSocket 类的继承类MySocket为了使应用程序能够捕捉和相应socket 事件,可以从AsyncSocket 创建自己的派生类。该类需要有自己版本的事件函数,也需要一种把此事件传到对话框的方法。为把每个事件传给对话框类、添加一个指向父对话框的指针作为socket 类的成员变量。对每个socket 事件使用此指针调用事件函数。具体做法, 如图所示:创建socket 类后

6、,为该类添加一个私有成员变量m_pWnd 作为指向父对话框的指针;然后必须在该类中,添加一个成员函数SetParent 以设置该指针,该函数在MySocket.cpp 文件中的实现代码为:void CMySocket:SetParent(CDialog* pWnd)m_pWnd=pWnd;/设置成员指针变量最后,MySocket 类,还必须添加事件函数,用于调用对话框类中名字相同的成员函数。为添加OnAccept 事件函数,可以ClassWizard 窗口中,单击右键|add virtual function注意:同时添加#include MySocket.h5.初始化CMySocket 类的

7、成员函数添加CMySocket 变量后,添加所有变量的初始化代码。默认设置为:应用程序类型设置为客户端程序,服务器名为loopback,端口为4000,在两个CMySocket 对象中设置父对话框的指针,指向对话框类对象。所有这些初始化,都在OnInitDialog 函数中完成。注意:计算机名loopback 是TCP/IP 网络协议的一个特殊名字,表示你正在这台计算机上工作,这个内部计算机名网址为127.0.0.1。需要与另一个程序连接,运行在同一台计算机上的应用程序都用此名字和网址。/ in MySockDlg.cppBOOL CMySockDlg:OnInitDialog()/省略代码(

8、自动生成的)/ TODO: Add extra initialization here/初始化控件对应的变量m_iType = 0;m_strName =loopback;m_iPort = 4000;/更新控件UpdateData(FALSE);/设置Socket 对应的对话框m_sConnectSocket.SetParent(this);m_sListenSocket.SetParent(this);return TRUE; 5.实现客户端与服务端间的连接功能用户单击“连接”按钮后,就禁止了对话框上顶端的所有控件,此时,用户不可修改对方计算机的设置或修改应用程序的监听方式。可以调用Cre

9、ate 函数,其Socket 变量根据应用程序运行在客户机或服务器上而定。最后调用Connect 或Listen 函数初始化应用程序端的连接。给应用程序添加如上功能,可以给“连接”按钮,ID 为IDC_BCONNECT,添加单击响应事件函数,或者双击“连接”按钮,进入编辑代码。/in MySockDlg.cppvoid CMySockDlg:OnBconnect()/ TODO: Add your control notification handler code here/使变量与控件同步UpdateData(TRUE);/使连接和类型控件无效GetDlgItem(IDC_BCONNECT)

10、-EnableWindow(FALSE);GetDlgItem(IDC_ESERVERNAME)-EnableWindow(FALSE);GetDlgItem(IDC_EPORT)-EnableWindow(FALSE);GetDlgItem(IDC_RCLIENT)-EnableWindow(FALSE);GetDlgItem(IDC_RSERVER)-EnableWindow(FALSE);/作为客户端还是服务器端?if(m_iType = 0)m_sConnectSocket.Create();/客户端,则创建缺省的Socketm_sConnectSocket.Connect(m_str

11、Name,m_iPort);/打开与服务器的连接elsem_sListenSocket.Create(m_iPort);/服务器端,则创建一个与制定端口号相关联的socketm_sListenSocket.Listen();/监听连接请求为完成此连接,要为对话框类的OnAccept 和OnConnect 函数添加socket 事件函数。这些函数都是Socket 类调用的,不需要任何参数,也不必返回任何结果。其中OnAccept 函数是在对方应用程序试图连接正在监听的Socket 时调用,将调用Socket 对象的Accept 函数,传入连接Sock 变量。当接受连接后,可以启用提示符和编辑框、

12、输入和发送消息给对方应用程序。实现把该函数添加给应用程序,应在对话类CMySockDlg 类添加一个共有访问成员函数:(void)OnAccept,并编辑此函数,添加实现代码。具体做法是,在classview 窗口中,CMySockDlg 类上单击右键,选择Add member function添加完成后,在MySockDlg.h 文件的类定义中,会出现OnAccept 函数的声明,同时MySockDlg.cpp 文件中也会出现该函数相应的代码框架,只需直接在函数体中加入实现代码即可。/in MySockDlg.hclass CMySockDlg : public CDialogpublic:

13、void OnAccept();/省略代码;/in MySockDlg.cppvoid CMySockDlg:OnAccept()/接受连接请求m_sListenSocket.Accept(m_sConnectSocket);/是文本和消息控件有效GetDlgItem(IDC_EMSG)-EnableWindow( TRUE);GetDlgItem(IDC_BSEND)-EnableWindow(TRUE);GetDlgItem(IDC_SMSG)-EnableWindow(TRUE);客户端,连接完成后只需使用消息输入和发送控件,还应使用close 按钮关闭客户机端的连接。同样的方法给对话框

14、类CMySockDlg 添加公有成员函数(void)OnConnect。/in MySockDlg.cppvoid CMySockDlg:OnConnect()/使文本和消息控件有效GetDlgItem(IDC_EMSG)-EnableWindow( TRUE);GetDlgItem(IDC_BSEND)-EnableWindow(TRUE);GetDlgItem(IDC_SMSG)-EnableWindow(TRUE);GetDlgItem(IDC_BCLOSE)-EnableWindow(TRUE);此时,对话框类CMySockDlg 还缺少几个函数,按照上述方法,依次添加公有访问方式、v

15、oid 类型的函数OnSend、OnReceive、OnClose,这几个函数的具体实现代码后面添加。到此,就可以编译和运行程序了。编译后,同时可以启动两份拷贝,一份作为服务器端,单击“监听”按钮设置为监听模式;另一个作为客户端,单击“连接”按钮与服务器连接。连接后,连接控件被禁用,消息发送控件被启用。7.实现客户端与服务器端间的消息收发功能实现了应用程序的连接后,下面是实现消息的收发功能,即使用户能够在对话框的编辑框中输入文本信息,然后单击“发送”按钮将消息发送给对方程序。发送后,正文添加到已发送消息的列表中。实现上述功能,需要在单击“发送”按钮后,应用程序检查是否有发送的消息,求取消息的长

16、度,发送此消息,并把消息添加到已发送的列表框中。把此项功能添加到应用程序,需要双击“发送”按钮,添加一个消息函数OnBsend,并为此函数添加相关代码。我们让该函数调用对话框类的成员函数OnSend./in Mysockdlg.cppvoid CMySockDlg:OnSend()int iLen;int iSent;/使控件与变量同步UpdateData(TRUE);/是否有信息要发送?if(m_strMessage != )/获取消息的长度iLen = m_strMessage.GetLength();/发送消息iSent = m_sConnectSocket.Send(LPCSTR(m_

17、strMessage),iLen);if(iSent = SOCKET_ERROR)/是否发送成功/错误处理代码else/把消息添加到已发送列表中m_ctlSend.AddString(m_strMessage);/把控件与变量同步UpdateData(FALSE);void CMySockDlg:OnBsend()OnSend();OnReceive 事件被激发时表示消息已经到达,可使用Receive 函数从Socket 接收信息,接收后将其转化成CString 类型的数据并把它添加到消息接收列表框中。对话框类的OnReceive函数,实现此功能,过程类似于上述。为CMySockDlg 类添

18、加成员函数OnReceive(即上一节中已经添加过),并添加代码:/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;/对信息进行结尾处理strRecv = pBuf;/复制接收到的消息CString 类型的变量中m_ctlRecv.AddString(strRecv);/增加信息到接收的列表框中UpdateData(FALSE);/使变量与控件同步8.添加终止连接的代码void CMySockDlg:OnClose(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论