Winsock程序综合实例.ppt
《Winsock程序综合实例.ppt》由会员分享,可在线阅读,更多相关《Winsock程序综合实例.ppt(78页珍藏版)》请在三一办公上搜索。
1、1页,人民邮电出版社,第10章 Winsock程序综合实例,2页,10.1使用MFC类库设计网络程序,10.1.1MFC类库简介MFC(Microsoft Foundation Classes)是微软公司提供的用于C+程序设计的基础类库,它由两大部分组成:一部分是通常所说的C+类库,是MFC类库的主体部分,这些类构成了MFC应用程序框架;另一部分是MFC预定义宏、全局变量和全局函数,是MFC类库的辅助部分。这两部分都是用MFC进行Windows应用程序开发不可缺少的组成部分。,3页,10.1使用MFC类库设计网络程序,MFC类库中定义的类主要有以下几种:(1)根类根类指CObject类,它是大
2、多数MFC类的最终基类,其他类都继承了CObject类的三个主要特征:在运行时识别对象所属的类。支持串行化,把对象存入文件中及从文件中读取对象。在运行时打印诊断信息。,4页,10.1使用MFC类库设计网络程序,(2)命令发送类命令发送类CCmdTarget封装了用户通过选择菜单或工具栏按钮向应用程序发送命令的界面。命令发送类CCmdTarget派生自CObject根类,它是应用程序结构类和窗口类的基类。,5页,10.1使用MFC类库设计网络程序,(3)应用程序结构类 应用程序结构类(Application Architecture Class)提供了应用程序的几乎所有通用功能,它们构成了Win
3、dows应用程序的主要框架。我们通过这些类的派生类,添加新成员函数或重载现有成员函数以实现需要的功能,从而构造应用程序框架。应用程序类主要有:应用程序线程支持类:MFC支持多线程,所有的应用程序至少有一个线程。CWinThread类是所有线程类的基类,封装了操作应用程序的多线程功能。CWinApp是CWinThread类的派生类,它封装了基于MFC的Windows应用程序的初始化、运行及终止等功能。CWinApp的全局对象控制着整个应用程序的流程。,6页,10.1使用MFC类库设计网络程序,文档类:文档类封装了应用程序的数据管理,文档类对象由文档模板创建。CDocument 类是文档类的基类,
4、用户应用程序文档类可从CDocument类直接派生。CDocument类支持一些标准操作,如新建文档,打开文档和存储文档等。文档模板类:文档模板类将文档、视图及边框窗口相互联系起来,在创建新文档或视图时协调文档、视图及边框窗口的创建。CDocTemplate类是一个抽象基类,它为文档模板封装了基本功能,用户不能直接使用该类。CMultiDocTemplate为多文档接口(MDI)提供了模板。CSingleDocTemplate为单文档接口(SDI)提供模板。,7页,10.1使用MFC类库设计网络程序,(4)窗口类 窗口类包括边框窗口类、视图类、对话框类、控件类、控件栏类和属性簿类,这些类的共同
5、之处是都封装了一个窗口句柄HWND,都是从CWnd派生的。(5)常用工具类在MFC中还定义了大量的工具类,如用于绘图的类、数组类等。(6)非派生自CObject的类在MFC中有些类不是从CObject类派生的,如用于Internet服务程序设计的API(Internet Server API)等。,8页,10.1使用MFC类库设计网络程序,10.1.2MFC中与网络程序设计有关的类在MFC类库中,与网络程序设计有关的类有以下几种:(1)文件服务类(File Services)在有关文件服务类的定义中有一个CSocketFile类,其实它并不是用来在双方套接口上发送文件的,而是将需要序列化的数据
6、,比如一些结构体数据传给对方。要注意的是CSocketFile类虽然派生自CFile类,但它屏蔽掉了CFile:Open()等函数,也就是说不能调用CSocketFile的Open函数来打开一个实实在在的文件,否则会导致例外。,9页,10.1使用MFC类库设计网络程序,10.1.2MFC中与网络程序设计有关的类(2)Internet服务器API类(Internet Server API)在Internet服务器API类中,主要定义了一些与HTTP协议有关的类,这些类是CHtmlStream、CHttpFilter、CHttpFilterContext、CHttpServer和CHttpServ
7、erContext。,10页,10.1使用MFC类库设计网络程序,10.1.2MFC中与网络程序设计有关的类(3)Internet服务类(Internet Serveices)Internet服务类中有与Internet会话有关的CInternetSession类,与Internet连接有关的CInternetConnection类,CInternetConnection有3个派生类,它们是CFtpConnection、CGopherConnection和CHttpConnection。与查找文件有关的CFileFind类,该类有两个派生类,它们是CFtpFileFind和CGopherFil
8、eFind类。这些类的具体功能与使用方法在10.2节的实例中介绍。,11页,10.1使用MFC类库设计网络程序,10.1.2MFC中与网络程序设计有关的类(4)Windows套接口类(Windows Sockets)MFC中定义了一个Windows套接口程序设计类CAsyncSocket,MFC还定义了一个派生于CAsyncSocket的CSocket类,这两个类简单易用,用户可以使用它们来实现自己的网络程序。以上四种类型的类中,Windows套接口类是最基本的,也是最常用的网络程序设计类,本节就以Windows套接口类程序设计类为例介绍MFC网络程序设计,至于其他的三种类,读者可以参考其他的
9、有关资料。,12页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类1.CAsyncSocket类CAsyncSocket类是一个异步非阻塞套接口程序设计类,它封装了一些基本的Windows Sockets API函数,这些函数提供了与较低层Windows Sockets对话的接口。常用的函数有:(1)Accept()函数Virtual BOOL Accept(CAsyncSocket该函数用于在一个套接口上接受连接请求。rConnectedSocket参数为监听套接口,lpSockAddr参数为指向地址的指针,其初始值为空,在连接建立后保存远程套接口的IP地址
10、,lpSockAddrLen参数为指向客户套接口地址长度的指针。,13页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(2)AsyncSelect()函数BOOL AsyncSelect(long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE);该函数用于在套接口准备好之后,请求网络事件通知。网络事件的含义见表10-1所示:,14页,10.1使用MFC类库设计网络程序,15页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(3)Attach()函数B
11、OOL Attach(SOCKET hSocket,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE);其中hSocket参数为套接口句柄。该函数的作用是将一个套接口句柄连接到一个CAsyncSocket对象实例上,即建立两者的关联,这样就可以实现与另一台计算机的连接了。,16页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(4)Bind()函数BOOL Bind(UINT nSocketPort,LPCTSTR lpszSocketAddress=NULL);BOOL Bin
12、d(const SOCKADDR*lpSockAddr,int nSockAddrLen);该函数用于建立一个本地地址与一个套接口的关联,即进行套接口与本了地址的绑定。它有两种调用格式,第一种调用格式提供套接口、端口号和地址,使用字符串形式的地址,一般常用的是这种调用方法。第二种调用格式提供SOCKADDR结构类型的地址参数。,17页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(5)Close()函数virtual void Close();该函数用于关闭套接口,释放与套接口有关的系统资源。要注意的是Close()函数是在对象被删除时由CAsyncSock
13、et的析构函数自动调用的。Close()函数的行为取决于套接口的SO_LINGER和SO_DONTLINGER选项。,18页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(6)Connect()函数BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort);BOOL Connect(const SOCKADDR*lpSockAddr,int nSockAddrLen);该函数用于建立与远程套接口的连接。它有两种调用格式,第一种调用格式使用套接口、端口号和地址,且地址使用参数为字符串型的地址参数,例如“”,或点分十
14、进制的地址,如“128.56.22.8”。第二种调用格式提供SOCKADDR结构类型的地址参数。,19页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(7)Create()函数BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);在调用CAsyncSocket的构造函数创建了CAsyncSocket对象
15、后,需要调用Create()函数来创建底层的套接口。因为CAsyncSocket的构造函数没有带参数,所以它只创建一个新的空套接口对象,创建底层套接口的真正工作是由Create()函数来完成的。其中,函数的第一个参数nSocketPort用于指定一个分配给套接口的端口号,其默认值为0,其真正的含义是告诉系统,可以由系统给该套接口分配一个端口号。在开发服务器程序时应该明确的分配一个端口号(即前面介绍的“众所周知”的端口号,这样客户就可以方便的使用该端口号与服务器连接。在开发客户程序时就可以使用默认的0值,即由系统自动分配一个端口号。函数的第二个参数nSocketType用来是指定流式(SOCK_
16、STREAM)还是数据报式(SOCK_DGRAM)套接口。第三个参数lEvent用来指定一个将为应用程序生成通知的事件。在默认情况下,所有的事件都会生成通知。最后一个参数lpszSocketAddress允许我们为套接口指定一个网络地址,其默认值为0,表示套接口的地址将限定为本地机。该地址以点分十进制的形式给定,如“128.56.22.8”。(8)Detach()函数SOCKET Detach();该函数作用是将上一次建立关联的套接口句柄断开,并返回此套接口句柄。(9)FromHandle()函数static*PASCAL FromHandle(SOCKET hSocket);该函数的hSoc
17、ket参数指定一个套接口的句柄,其作用是返回与此套接口关联的CAsyncSocket对象的指针。如果没有与此套接口关联的CAsyncSocket对象,则返回值为空(NULL)。(10)GetLastError()函数static int GetLastError();在实际应用中,当调用的操作失败后用于返回套接口的错误代码。(11)GetPeerName()函数BOOL GetPeerName(CString该函数是一个需要重载的回调函数,当一个套接口已经准备好数据,并可以由函数Receive()接收时,就可以调用此函数处理相应的消息。,20页,10.1使用MFC类库设计网络程序,10.1.3
18、MFC中的Windows套接口类(7)Create()函数BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);在调用CAsyncSocket的构造函数创建了CAsyncSocket对象后,需要调用Create()函数来创建底层的套接口。因为CAsyncSocket的构造函数没有带参数,所以它只创建一个新的空套接口对象,创建底层套接口的真
19、正工作是由Create()函数来完成的。,21页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(7)Create()函数BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);在调用CAsyncSocket的构造函数创建了CAsyncSocket对象后,需要调用Create()函数来创建底层的套接口。因为
20、CAsyncSocket的构造函数没有带参数,所以它只创建一个新的空套接口对象,创建底层套接口的真正工作是由Create()函数来完成的。其中,函数的第一个参数nSocketPort用于指定一个分配给套接口的端口号,其默认值为0,其真正的含义是告诉系统,可以由系统给该套接口分配一个端口号。在开发服务器程序时应该明确的分配一个端口号(即前面介绍的“众所周知”的端口号,这样客户就可以方便的使用该端口号与服务器连接。在开发客户程序时就可以使用默认的0值,即由系统自动分配一个端口号。函数的第二个参数nSocketType用来是指定流式(SOCK_STREAM)还是数据报式(SOCK_DGRAM)套接口
21、。第三个参数lEvent用来指定一个将为应用程序生成通知的事件。在默认情况下,所有的事件都会生成通知。最后一个参数lpszSocketAddress允许我们为套接口指定一个网络地址,其默认值为0,表示套接口的地址将限定为本地机。该地址以点分十进制的形式给定,如“128.56.22.8”。(8)Detach()函数SOCKET Detach();该函数作用是将上一次建立关联的套接口句柄断开,并返回此套接口句柄。(9)FromHandle()函数static*PASCAL FromHandle(SOCKET hSocket);该函数的hSocket参数指定一个套接口的句柄,其作用是返回与此套接口关
22、联的CAsyncSocket对象的指针。如果没有与此套接口关联的CAsyncSocket对象,则返回值为空(NULL)。(10)GetLastError()函数static int GetLastError();在实际应用中,当调用的操作失败后用于返回套接口的错误代码。(11)GetPeerName()函数BOOL GetPeerName(CString该函数是一个需要重载的回调函数,当一个套接口已经准备好数据,并可以由函数Receive()接收时,就可以调用此函数处理相应的消息。,22页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类其中,函数的第一个参数n
23、SocketPort用于指定一个分配给套接口的端口号,其默认值为0,其真正的含义是告诉系统,可以由系统给该套接口分配一个端口号。在开发服务器程序时应该明确的分配一个端口号(即前面介绍的“众所周知”的端口号,这样客户就可以方便的使用该端口号与服务器连接。在开发客户程序时就可以使用默认的0值,即由系统自动分配一个端口号。函数的第二个参数nSocketType用来是指定流式(SOCK_STREAM)还是数据报式(SOCK_DGRAM)套接口。第三个参数lEvent用来指定一个将为应用程序生成通知的事件。在默认情况下,所有的事件都会生成通知。最后一个参数lpszSocketAddress允许我们为套接
24、口指定一个网络地址,其默认值为0,表示套接口的地址将限定为本地机。该地址以点分十进制的形式给定,如“128.56.22.8”。,23页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(8)Detach()函数SOCKET Detach();该函数作用是将上一次建立关联的套接口句柄断开,并返回此套接口句柄。(9)FromHandle()函数static*PASCAL FromHandle(SOCKET hSocket);该函数的hSocket参数指定一个套接口的句柄,其作用是返回与此套接口关联的CAsyncSocket对象的指针。如果没有与此套接口关联的CAsy
25、ncSocket对象,则返回值为空(NULL)。(10)GetLastError()函数static int GetLastError();在实际应用中,当调用的操作失败后用于返回套接口的错误代码。,24页,10.1使用MFC类库设计网络程序,10.1.3MFC中的Windows套接口类(11)GetPeerName()函数BOOL GetPeerName(CString对于指定的套接口调用GetPeerName()函数,就可以返回与之对应的远程套接口的IP地址和端口号。远程套接口的IP地址和端口号分别由rPeerAddress和rPeerPort参数返回,也可以由指向SOCKADDR结构的参
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Winsock 程序综合 实例
链接地址:https://www.31ppt.com/p-6523773.html