实验二基于Windows的MFC WINSOCK编程
天津理工大学实验报告
List box Button Button
IDC_LRECV IDC_BCONNECT IDC_BCLOSE 连接 关闭
3.为控件添加对应的成员变量和映射消息响应函数
双击“发送”按钮,添加 OnBsend 函数;双击“关闭”按钮,添加 OnBclose 函数;复用“连 接”按钮,当选择客户端按钮时显示“连接”;当选择服务端时显示“监听”。为两个单选按 钮添加一个消息函数, 根据当前选择的按钮修改命令的正文。具体做法是,双击 IDC_RCLIENT 控件,添加函数 OnRType 函数,同时双击 IDC_RSERVER 控件,添加该函 数。 编辑该函数,添加如下代码: //in MySockDlg.cpp void CMySockDlg::OnRType() { // TODO: Add your control notification handler code here UpdateData(TRUE); //使控件与变量同步 if(m_iType==0) //m_iType=0 即 client 端 m_ctlConnect.SetWindowText("连接");//m_ctlConnect 为控件“连接”按钮的映射变量 else m_ctlConnect.SetWindowText("监听"); } 运行程序,结果如下图所示:
选中“客户端”显示“连接”;选中“服务器端”显示“监听”:
4.添加 CAsyncSocket 类的继承类 MySocket 为了使应用程序能够捕捉和相应 socket 事件,可以从 AsyncSocket 创建自己的派生类。该 类 需要有自己版本的事件函数, 也需要一种把此事件传到对话框的方法。 为把每个事件传给对 话框类、添加一个指向父对话框的指针作为 socket 类的成员变量。对每个 socket 事件使用 此指针调用事件函数。具体做法, 如图所示: 创建 socket 类后,为该类添加一个私有成员变量 m_pWnd 作为指向父对话框的指针;然后 必须在该类中,添加一个成员函数 SetParent 以设置该指
针,该函数在 MySocket.cpp 文件中 的 实现代码为: void CMySocket::SetParent(CDialog* pWnd) { m_pWnd=pWnd;//设置成员指针变量 } 最后,MySocket 类,还必须添加事件函数,用于调用对话框类中名字相同的成员函数。为 添加 OnAccept 事件函数,可以 ClassWizard 窗口中,单击右键|add virtual function… 注意:同时添加#include "MySocket.h" 5.初始化 CMySocket 类的成员函数 添加 CMySocket 变量后,添加所有变量的初始化代码。默认设置为:应用程序类型设置为 客户端程序,服务器名为 loopback,端口为 4000,在两个 CMySocket 对象中设置父对话框 的指针,指向对话框类对象。所有这些初始化,都在 OnInitDialog 函数中完成。 注意:计算机名 loopback 是 TCP/IP 网络协议的一个特殊名字,表示你正在这台计算机上 工 作,这个内部计算机名网址为 127.0.0.1。需要与另一个程序连接,运行在同一台计算机上的 应用程序都用此名字和网址。 // in MySockDlg.cpp BOOL CMySockDlg::OnInitDialog() { //省略代码(自动生成的) // 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.实现客户端与服务端间的连接功能 用户单击“连接”按钮后,就禁止了对话框上顶端的所有控件,此时,用户不可修改对方计
算机的设置或修改应用程序的监听方式。可以调用 Create 函数,其 Socket 变量根据应用程 序运行在客户机或服务器上而定。最后调用 Connect 或 Listen 函数初始化应用程序端的连 接。 给应用程序添加如上功能,可以给“连接”按钮,ID 为 IDC_BCONNECT,添加单击响应事 件函数,或者双击“连接”按钮,进入编辑代码。 //in MySockDlg.cpp void CMySockDlg::OnBconnect() { // TODO: Add your control notification handler code here //使变量与控件同步 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); //作为客户端还是服务器端? if(m_iType == 0) { m_sConnectSocket.Create();//客户端,则创建缺省的 Socket m_sConnectSocket.Connect(m_strName,m_iPort);//打开与服务器的连接 } else { m_sListenSocket.Create(m_iPort);//服务器端,则创建一个与制定端口号相关联的 socket m_sListenSocket.Listen();//监听连接请求 } } 为完成此连接,要为对话框类的 OnAccept 和 OnConnect 函数添加 socket 事件函数。这些 函 数都是 Socket 类调用的,不需要任何参数,也不必返回任何结果。其中 OnAccept 函数是 在
对方应用程序试图连接正在监听的 Socket 时调用,将调用 Socket 对象的 Accept 函数,传 入 连接 Sock 变量。当接受连接后,可以启用提示符和编辑框、输入和发送消息给对方应用程 序。实现把该函数添加给应用程序,应在对话类 CMySockDlg 类添加一个共有访问成员函 数: (void)OnAccept,并编辑此函数,添加实现代码。 具体做法是, 在 classview 窗口中, CMySockDlg 类上单击右键, 选择 Add member function… 添加完成后,在 MySockDlg.h 文件的类定义中,会出现 OnAccept 函数的声明,同时 MySockDlg.cpp 文件中也会出现该函数相应的代码框架,只需直接在函数体中加入实现代 码 即可。
//in MySockDlg.h class CMySockDlg : public CDialog { public: void OnAccept(); //省略代码 }; //in MySockDlg.cpp void CMySockDlg::OnAccept() { //接受连接请求 m_sListenSocket.Accept(m_sConnectSocket); //是文本和消息控件有效 GetDlgItem(IDC_EMSG)->EnableWindow( TRUE); GetDlgItem(IDC_BSEND)->EnableWindow(TRUE); GetDlgItem(IDC_SMSG)->EnableWindow(TRUE); } 客户端,连接完成后只需使用消息输入和发送控件,还应使用 close 按钮关闭客户机端的连 接。同样的方法给对话框类 CMySockDlg 添加公有成员函数(void)OnConnect。 //in MySockDlg.cpp void CMySockDlg::OnConnect() { //使文本和消息控件有效 GetDlgItem(IDC_EMSG)->EnableWindow( TRUE); GetDlgItem(IDC_BSEND)->EnableWindow(TRUE); GetDlgItem(IDC_SMSG)->EnableWindow(TRUE); GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE); } 此时,对话框类 CMySockDlg 还缺少几个函数,按照上述方法,依次添加公有访问方式、 void 类型的函数 OnSend、OnReceive、OnClose,这几个函数的具体实现代码后面添加。 到此,就可以编译和运行程序了。 编译后,同时可以启动两份拷贝,一份作为服务器端,单击“监听”按钮设置为监听模式; 另一个作为客户端,单击“连接”按钮与服务器连接。连接后,连接控件被禁用,消息发送 控件被启用。 7.实现客户端与服务器端间的消息收发功能 实现了应用程序的连接后, 下面是实现消息的收发功能, 即使用户能够在对话框的编辑框中 输入文本信息,然后单击“发送”按钮将消息发送给对方程序。发送后,正文添加到已发送 消息的列表中。实现上述功能,需要在单击“发送”按钮后,应用程序检查是否有发送的消 息,求取消息的长度,发送此消息,并把消息添加到已发送的列表框中。 把此项功能添加到应用程序,需要双击“发送”按钮,添加一个消息函数 OnBsend,并为此 函数添加相关代码。我们让该函数调用对话框类的成员 …… 此处隐藏:4098字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用文档]李践-有效提升销售的12大黄金法则8-大
- [实用文档]党支部换届工作方案
- [实用文档]2013年下期电子商务专业部宣传工作计划
- [实用文档]方庄一矿通风、钻探绩效工资考核管理办
- [实用文档]项目一 认识企业物流认识企业物流
- [实用文档]MBI_Display_产品蓝图规画
- [实用文档]北京市建筑业劳务作业人员普法维权培训
- [实用文档]锅炉燃烧调整与运行优化
- [实用文档]4支付结算业务的核算
- [实用文档]米什金_货币金融学_第9版各章学习指导
- [实用文档]水泥混凝土路面硬化工程施工组织设计
- [实用文档]钢筋工程安全技术交底书
- [实用文档]关于公布华中师范大学本科毕业论文
- [实用文档]太原市园林绿化施工合同范本 2
- [实用文档]周日辅导 初中英语分类复习单项选择题(
- [实用文档]第四章 文化经纪人的管理形式 第二节
- [实用文档]学宪法讲宪法竞赛题库
- [实用文档]《数值计算方法》期末考试模拟试题二
- [实用文档]爱词霸学英语:每日一句( 十月)
- [实用文档]2014年国家公务员面试:无领导小组讨论
- 新课程主要理念和教学案例分析汇编(24
- 英国人的快乐源于幸福的家庭生活
- 七年级上册第一次月考模拟数学试卷
- 真丝及仿真丝的种类有哪些?
- 【最新】华师大版八年级数学下册第十六
- 高中英语3500个必背单词
- 我可以接受失败,但我不能接受放弃!
- 最近更新沪科版八年级物理上册期末试卷
- 绿化工作先进乡镇事迹材料
- 鲁教版九年级上册思想品德教学计划
- 英语音标的分类
- 地下室底板无梁楼盖与普通梁板结构形式
- 美容师黄金销售话术
- 雅思写作满分作文备考方法
- 血清甲状腺激素测定与高频彩色多普勒超
- 1度浅析装修对室内空气品质的影响
- 2017-2022年中国汞矿行业深度分析与投
- 计算机二级VB公共基础知识
- (何勇)秸秆禁烧_重在寻找出路
- 内外墙抹灰工程分包施工合同1




