




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内容预览VC环境下WinSock编程及实例分析王振江(华北电力大学,河北保定071003) 摘要:Visual C对网络应用程序开发的支持是十分强大和充分的。为了简化WinSock网络编程,Microsoft的基本类库(Microsoft Foundation Class或MFC)提供了两种利用Windows Sockets进行网络通信的编程模式,这两种模式即为用CAsyncSocket类和派生于CAsyncSocket的CSocket类来编程。通过创建一个比较简单的基于MFC WinSock类的应用程序,详细分析了WinSock编程。 关键词:WinSock;网络;CSocket 最近几年,计算机网络的发展一日千里,人们对网络服务应用程序的要求也越来越高、越来越多。现在虽然有很多的网络应用程序,但是在很多的情况下,需要开发适合自己使用的网络应用程序。Microsoft公司的Visual C平台是一个具有高度综合性的软件开发工具,它不仅具有很强的程序处理能力,而且还能提供多种的编程风格;与Visual C捆绑的MFC(Microsoft Foundation Class)提供了大量的封装良好的类,使用户在使用Visual C时有如虎添翼的感觉。Visual C对网络应用程序开发的支持是十分强大和充分的。1WinSock编程原理直接采用WinSock API函数来编程对于初学者很不轻松,不但要记忆很多的WinSock API函数的调用格式,还要了解设计WinSock网络编程的算法。对于编写Windows应用程序来说,还要涉及复杂的消息驱动机制,涉及事件处理函数来处理套接字发送、接收数据等事件。为了简化WinSock网络编程,使用户专注于应用程序算法的设计,Microsoft的基本类库(MicrosoftFoundation Class或MFC)提供了两种利用WindowsSockets进行网络通信的编程模式,这两种模式即为用CAsyncSocket类和派生于CAsyncSocket的CSocket类来编程。这两个类在不同程度上对WinSock API的函数进行了封装,在编程时使用经过封装的MFCWinSock类使编程工作大大简化,而且,这两个类都提供了事件处理函数,通过对事件处理函数进行重载,用户可以在应用程序中很方便地对套接字发送、接收数据等事件进行处理。CAsyncSocket类封装了Windows Sockets API函数,提供了较低层的与Windows Sockets对话接口,一般适合于有相当水平的网络编程基础者使用,可方便地进行底层的网络事件通知及信息回叫控制等操作。CAsyncSocket类是从CObject类派生而来的,派生关系如图1所示。CSocket派生于CAsyncSocket,派生关系如图2所示。它继承了父类中一些常用易懂的Windows Sockets API函数,并对CAsyncSocket中底层的较难控制的一些API函数或成员函数进行了处理,它通过MFCCArchive对象进行信息的接发操作,使得网络传输如同使用MFC的文档连载协议(Serialization protocol),简捷易用。同时它支持模块化的后台信息处理,解决了CAsyncSocket中较难克服的多线程处理。2实例分析下面通过一个客户机服务器模式的网络应用程序,实现对CSocket类的派生和应用。21利用MFCAppWizard生成程序框架建立基于对话框构架的应用程序,填写工程名为Chat。在第2步中选中Windows Socket复选框,接受其他默认的MFCAppWizard设置。22增加控件对象 向主对话框添加控件。该应用程序是客户机服务器一体的,因此设置了组合框(Combo Box)控件来指定应用程序是作为客户机还是服务器而运行;还需要一组编辑框(EditBox)用于输入计算机的名称和服务器侦听的端口号,以及一个用于启动应用程序对socket的侦听,或打开与服务器连接的按钮(Button)控件。为了输入字符串及显示发送的字符串,需要一个编辑框控件,用来输入要发送的消息,以及用于发送此消息的按钮控件;还需要一对列表框控件,用于显示发送和接收的消息。在MFCClassWizard中,将对话框中的控件和变量相关联,如表2所示。 2.3 添加消息映射函数 为了区分应用程序是用于服务器还是客户机,用户在选择组合框内容后,“连接”按钮随用户的选择而改变。用对组合框选区内容改变的事件CBNSELCHANGE产生消息映射函数。在MFC ClassWizard中,对IDCOMBOTYPE添加针对CBNSELCHANGE事件的函数。并编辑该函数。 24从CSocket继承为了应用程序能够捕获并响应socket事件,应该创建用户自己的从CSocket类继承的派生类,这是WinSock编程的基础,因为所有的WinSock应用程序都是间接地利用MFC的WinSock类,用户应该根据自己应用程序的特点,从MFC提供的WinSock类派生出自己需要的WinSock类。该类需要一种手段以便把Socket事件传递给类对象所属的对话框,还需要有自己的事件处理函数。在MFCClassWizard中,创建新类CMySocket,Baseclass选择CSocket。在CMySocket头文件中类定义之前,加入:class CChatDlg;在Socket类中添加一个成员变量,用作指向父对话框窗口的指针:public:CChatDlgm_pDlg;在Socket类中添加事件处理函数,用于调用对话框中名称类似的那些函数。对于服务器功能,要针对OnAccept事件为Socket类添加一个事件处理函数:在Socket类中添加了所有的必要事件处理之后,应该向对话框添加Socket类的变量对象。对于服务器功能,在对话框中应该需要两个套接字,一个用于侦听连接请求,另一个用来被连接到另一个应用程序;对于客户机功能,只需要一个用于连接的套接字就可以了。因为对话框需要两个套接字对象,所以需要向对话框类(CChatDlg)中添加两个成员变量。两个成员变量的类型均为套接字类(CMySocket)。其中用于侦听请求的变量命名为m sListenSocket,把用于发送和接收消息的变量命名为m-sConnectSocket。在添加了套接字变量后,需要为对话框类中所有的变量添加初始化代码。作为缺省设置,把应用程序的类型设置为“客户机”,把服务器名设置为localhost,端口值设置为8000,除了这些变量,还需要把两个套接字对象中的父对话框指针设置为指向当前对话框。上述操作在对话框类中的OnInitDialog()函数中实现。25建立客户机与服务器之间的连接打开ClassWizard,为“连接”按钮的BN_CLICKED事件添加事件处理函数,编辑该函数。void CChatDlg:OnBtnConnect()TODO:Add your control notification handler codehere 从对话框取回数据UpdateData(TRUE); 是“客户机”,还是“服务器”?if(m_cmbTypeGetCurSel()0)服务器 创建与设置的端口绑定的套接字 m-sListenSocket.Lister(); 开始侦听连接请求m sListenSocketListen();else 客户机 创建一个默认的套接字m sConnectSocketCreate(); 发出连接请求m_sConnectSocketConnect(m_strSName,mnSPort);为了完成连接,需要添加对套接字事件的处理函数,在对话框类中添加OnAccept()事件处理函数。void CChatDlg:OnAccept()m-sListenSocket.Accept(m-sConnectSocket);26发送和接收数据在实现了客户机和服务器两个应用程序相互连接之后,下一步要做的就是在两个应用程序之间实现消息的发送和接收。如果两个程序建立了连接,用户就能够在对话框窗口中部的编辑框中输入文本消息,然后单击“发送”按钮,可以把消息发送到另一个应用程序,消息被发送出去后,将被添加到已发送消息的列表框中。要实现上述功能,当“发送”按钮被单击之 后,应用程序需要检查是否有消息输入了编辑框,获取该消息的长度,并发送该消息,然后把此消息添加到列表框中。为了在程序中添加此功能,使用ClassWizard向“发送”按钮的单击事件(BN_CLICKED)添加一个事件处理函数,注意不要接受默认的函数名,将函数名改为OnSendMsg()(这样处理后,就屏蔽了基于对话框的应用程序对“回车键”的默认功能,输入“回车键”后,消息被发送)。编辑该函数,如下:void CChatDlg:OnSendMsg()int nLen;消息长度int nSend;已发送消息的长度UpdateData(TRUE);获取消息长度nLenm strMsgGetLength();发送消息nSent=m-sConnectSocket.Send(LPCTSTR(m-strMsg),nLen);将消息添加到“已发送的消息”列表框m listSentAddString(m strMsg);UpdateData(FALSE);清除当前消息m strMsgEmpty();UpdateData(FALSE);对于消息的接收方,当套接字的OnReceive事件被触发时,表明一个消息已经到达了,可以用Receive()函数从套接字检索到该消息。如果消息被顺利检索到,需要把接收的字符数组转换成CString类型,并把接收的消息添加到已接受的消息的列表框中。通过编辑对话框类(CChatDlg)的OnReceive()函数,可以添加该项功能,如下:void CChatDlg:OnReceive() charpBufnewchar1025; int nBufSize1024; in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考数学知识点总结及高中数学解题思想方法
- 2025新疆机场(集团)有限责任公司伊宁管理分公司招聘(105人)笔试参考题库附带答案详解
- 2025年蚌埠市城市投资控股集团有限公司社会招聘11人笔试参考题库附带答案详解
- 2025年湖北省新能源有限公司社会招聘24人笔试参考题库附带答案详解
- 2025山东菏泽市劳信就业服务有限公司招聘派遣制人员24人笔试参考题库附带答案详解
- 2025天津市武清区国有资产经营投资有限公司招聘13人笔试参考题库附带答案详解
- 2025四川长虹置业有限公司招聘核算会计等岗位2人笔试参考题库附带答案详解
- 演员服务合同协议
- 租养殖场合同协议
- 英文企业合同协议
- 2024年美国商用车和乘用车市场现状及上下游分析报告
- 幼儿园语言故事《阿里巴巴和四十大盗》课件
- 浙教版八年级信息技术上册《第8课网页的数据呈现》课件
- 便秘课件完整版本
- 2024-2029年波分复用器(WDM)行业市场现状供需分析及重点企业投资评估规划分析研究报告
- DB32T3748-2020 35kV及以下客户端变电所建设标准
- 家庭医生签约服务培训
- 中华民族共同体概论课件专家版6第六讲 五胡入华与中华民族大交融(魏晋南北朝)
- 《狼和鸭子》PPT课件小学幼儿园儿童故事表演幻灯片背景有音乐
- 第2课+古代希腊罗马(教学设计)-【中职专用】《世界历史》(高教版2023基础模块)
- 工会制度牌模板
评论
0/150
提交评论