收藏 分享(赏)

windows坏境下面向套接字编程实例.doc

上传人:yjrm16270 文档编号:7651448 上传时间:2019-05-23 格式:DOC 页数:6 大小:47.50KB
下载 相关 举报
windows坏境下面向套接字编程实例.doc_第1页
第1页 / 共6页
windows坏境下面向套接字编程实例.doc_第2页
第2页 / 共6页
windows坏境下面向套接字编程实例.doc_第3页
第3页 / 共6页
windows坏境下面向套接字编程实例.doc_第4页
第4页 / 共6页
windows坏境下面向套接字编程实例.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、内 容 预 览VC环境下 WinSock 编程及实例分析王振江(华北电力大学,河北保定 071003 ) 摘 要:Visual C对网络应用程序开发的支持是十分强大和充分的。为了简化 WinSock 网络编程,Microsoft 的基本类库(Microsoft Foundation Class 或 MFC)提供了两种利用 Windows Sockets 进行网络通信的编程模式,这两种模式即为用 CAsyncSocket 类和派生于 CAsyncSocket 的 CSocket 类来编程。通过创建一个比较简单的基于 MFC WinSock 类的应用程序,详细分析了 WinSock 编程。关键词:

2、WinSock;网络;CSocket 最近几年,计算机网络的发展一日千里,人们对网络服务应用程序的要求也越来越高、越来越多。现在虽然有很多的网络应用程序,但是在很多的情况下,需要开发适合自己使用的网络应用程序。Microsoft 公司的 Visual C平台是一个具有高度综合性的软件开发工具,它不仅具有很强的程序处理能力,而且还能提供多种的编程风格;与 Visual C捆绑的 MFC(Microsoft Foundation Class)提供了大量的封装良好的类,使用户在使用 Visual C时有如虎添翼的感觉。Visual C对网络应用程序开发的支持是十分强大和充分的。1 WinSock 编

3、程原理直接采用 WinSock API 函数来编程对于初学者很不轻松,不但要记忆很多的 WinSock API 函数的调用格式,还要了解设计 WinSock 网络编程的算法。对于编写 Windows 应用程序来说,还要涉及复杂的消息驱动机制,涉及事件处理函数来处理套接字发送、接收数据等事件。为了简化 WinSock 网络编程,使用户专注于应用程序算法的设计,Microsoft 的基本类库(MicrosoftFoundation Class 或 MFC)提供了两种利用 WindowsSockets 进行网络通信的编程模式,这两种模式即为用 CAsyncSocket 类和派生于 CAsyncSoc

4、ket 的 CSocket类来编程。这两个类在不同程度上对 WinSock API 的函数进行了封装,在编程时使用经过封装的MFCWinSock 类使编程工作大大简化,而且,这两个类都提供了事件处理函数,通过对事件处理函数进行重载,用户可以在应用程序中很方便地对套接字发送、接收数据等事件进行处理。CAsyncSocket 类封装了 Windows Sockets API 函数,提供了较低层的与 Windows Sockets 对话接口,一般适合于有相当水平的网络编程基础者使用,可方便地进行底层的网络事件通知及信息回叫控制等操作。CAsyncSocket 类是从 CObject 类派生而来的,派

5、生关系如图 1 所示。CSocket 派生于 CAsyncSocket,派生关系如图 2 所示。它继承了父类中一些常用易懂的 Windows Sockets API 函数,并对 CAsyncSocket 中底层的较难控制的一些 API 函数或成员函数进行了处理,它通过 MFCCArchive 对象进行信息的接发操作,使得网络传输如同使用 MFC 的文档连载协议(Serialization protocol),简捷易用。同时它支持模块化的后台信息处理,解决了 CAsyncSocket 中较难克服的多线程处理。2 实例分析下面通过一个客户机服务器模式的网络应用程序,实现对 CSocket 类的派生

6、和应用。21 利用 MFCAppWizard 生成程序框架建立基于对话框构架的应用程序,填写工程名为 Chat。在第 2 步中选中 Windows Socket 复选框,接受其他默认的 MFCAppWizard 设置。22 增加控件对象向主对话框添加控件。该应用程序是客户机服务器一体的,因此设置了组合框(Combo Box)控件来指定应用程序是作为客户机还是服务器而运行;还需要一组编辑框(EditBox)用于输入计算机的名称和服务器侦听的端口号,以及一个用于启动应用程序对 socket 的侦听,或打开与服务器连接的按钮(Button )控件。为了输入字符串及显示发送的字符串,需要一个编辑框控件

7、,用来输入要发送的消息,以及用于发送此消息的按钮控件;还需要一对列表框控件,用于显示发送和接收的消息。在 MFCClassWizard 中,将对话框中的控件和变量相关联,如表 2 所示。 2.3 添加消息映射函数为了区分应用程序是用于服务器还是客户机,用户在选择组合框内容后,“连接” 按钮随用户的选择而改变。用对组合框选区内容改变的事件CBN SELCHANGE产生消息映射函数。在MFC ClassWizard 中,对 IDCOMBOTYPE 添加针对 CBNSELCHANGE 事件的函数。并编辑该函数。24 从 CSocket 继承为了应用程序能够捕获并响应 socket 事件,应该创建用户

8、自己的从 CSocket 类继承的派生类,这是WinSock 编程的基础,因为所有的 WinSock 应用程序都是间接地利用 MFC 的 WinSock 类,用户应该根据自己应用程序的特点,从 MFC 提供的 WinSock 类派生出自己需要的 WinSock 类。该类需要一种手段以便把 Socket 事件传递给类对象所属的对话框,还需要有自己的事件处理函数。在 MFCClassWizard 中,创建新类 CMySocket,Baseclass 选择 CSocket。在 CMySocket 头文件中类定义之前,加入:class CChatDlg;在 Socket 类中添加一个成员变量,用作指向

9、父对话框窗口的指针:public:CChatDlgm_pDlg;在 Socket 类中添加事件处理函数,用于调用对话框中名称类似的那些函数。对于服务器功能,要针对 OnAccept 事件为 Socket 类添加一个事件处理函数:在 Socket 类中添加了所有的必要事件处理之后,应该向对话框添加 Socket 类的变量对象。对于服务器功能,在对话框中应该需要两个套接字,一个用于侦听连接请求,另一个用来被连接到另一个应用程序;对于客户机功能,只需要一个用于连接的套接字就可以了。因为对话框需要两个套接字对象,所以需要向对话框类(CChatDlg)中添加两个成员变量。两个成员变量的类型均为套接字类(

10、CMySocket)。其中用于侦听请求的变量命名为 m sListenSocket,把用于发送和接收消息的变量命名为 m-sConnectSocket。在添加了套接字变量后,需要为对话框类中所有的变量添加初始化代码。作为缺省设置,把应用程序的类型设置为“客户机”,把服务器名设置为 localhost,端口值设置为 8000,除了这些变量,还需要把两个套接字对象中的父对话框指针设置为指向当前对话框。上述操作在对话框类中的 OnInitDialog()函数中实现。25 建立客户机与服务器之间的连接打开 ClassWizard,为“连接”按钮的 BN_CLICKED 事件添加事件处理函数,编辑该函数

11、。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_s

12、trSName,mnSPort);为了完成连接,需要添加对套接字事件的处理函数,在对话框类中添加 OnAccept()事件处理函数。void CChatDlg:OnAccept()m-sListenSocket.Accept(m-sConnectSocket);26 发送和接收数据在实现了客户机和服务器两个应用程序相互连接之后,下一步要做的就是在两个应用程序之间实现消息的发送和接收。如果两个程序建立了连接,用户就能够在对话框窗口中部的编辑框中输入文本消息,然后单击“发送” 按钮,可以把消息发送到另一个应用程序,消息被发送出去后,将被添加到已发送消息的列表框中。要实现上述功能,当“发送 ”按钮被

13、单击之 后,应用程序需要检查是否有消息输入了编辑框,获取该消息的长度,并发送该消息,然后把此消息添加到列表框中。为了在程序中添加此功能,使用ClassWizard 向“发送”按钮的单击事件(BN_CLICKED)添加一个事件处理函数,注意不要接受默认的函数名,将函数名改为 OnSendMsg()(这样处理后,就屏蔽了基于对话框的应用程序对 “回车键”的默认功能,输入“回车键”后,消息被发送)。编辑该函数,如下:void CChatDlg:OnSendMsg()int nLen;消息长度int nSend;已发送消息的长度UpdateData(TRUE);获取消息长度nLenm strMsgGe

14、tLength();发送消息nSent=m-sConnectSocket.Send(LPCTSTR(m-strMsg),nLen);将消息添加到“已发送的消息 ”列表框m listSentAddString(m strMsg);UpdateData(FALSE);清除当前消息m strMsgEmpty ();UpdateData(FALSE);对于消息的接收方,当套接字的 OnReceive 事件被触发时,表明一个消息已经到达了,可以用Receive()函数从套接字检索到该消息。如果消息被顺利检索到,需要把接收的字符数组转换成CString 类型,并把接收的消息添加到已接受的消息的列表框中。通

15、过编辑对话框类(CChatDlg )的OnReceive()函数,可以添加该项功能,如下:void CChatDlg:OnReceive ()charpBufnewchar 1025 ;int nBufSize1024 ;int nReceived;CString strReceived;接收消息nReceivedm_sConnectSocketReceive(pBuf ,nBufSize);保留接收消息的有效部分 3 MFCWinSock 使用技术小结2 )建立连接服务器侦听4 结束语通过创建一个比较简单的基于 MFCWinSock 类的应用程序,分析了如何从 CSocket 类派生出自己需要的套接字类,如何利用套接字建立连接、传输数据,如何对套接字事件进行处理。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报