MFCSocket编程

上传人:平*** 文档编号:47558566 上传时间:2018-07-02 格式:PPT 页数:81 大小:2.59MB
返回 下载 相关 举报
MFCSocket编程_第1页
第1页 / 共81页
MFCSocket编程_第2页
第2页 / 共81页
MFCSocket编程_第3页
第3页 / 共81页
MFCSocket编程_第4页
第4页 / 共81页
MFCSocket编程_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《MFCSocket编程》由会员分享,可在线阅读,更多相关《MFCSocket编程(81页珍藏版)》请在金锄头文库上搜索。

1、2.12.2MFC及其Socket类Socket类网络编程2.3Socket程序的互通2.1.1 MFC简介 MFC是很庞大的,以Visual C+ 6.0所带的MFC 4.21为例 ,已经包含了多达上百个类、结构和接口!该层次结构可分为如下几种不同的类型: 应用程序框架; 图形绘制的绘制对象; 文件服务; 异常处理; 结构,如Lists、Arrays和Maps; Internet服务; OLE 2; 数据库1CAsyncSocket类 CAsyncSocket类是从MFC的根类CObject派生出来的,它 在较低的级别上封装Windows Socket API,因此类中包含的 大部分成员函数

2、和底层Winsock API函数有很多相似之处,有 的甚至连名称和参数叫法都是相同或相近的。2CSocket类及其相关类(1)CSocket类。CSocket类是从CAsyncSocket类派生而来的,它继承了CAsyncSocket对Windows Socket API的封装。与CAsyncSocket对象相比,CSocket对象代表了Windows Socket API的更高一级的抽象化。(2)CSocket与CArchive、CSocketFile类的配合使用。使用CSocket类编写网络程序,既可以使用如CAsyncSocket类网络程序一样的Send和Receive函数来收发信息,也

3、可以与CSocketFile类和CArchive类一起管理数据的发送和接收。补充:CString与stringlstring为标准模板类(STL)定义的字符 串类,在标准c+或者跨平台使用程序中 建议使用。lCString均是字符串模板类,在MFC或者 ATL中实现,在使用mfc编程时建议使用 CString。2.2.1 客户端服务器方式(C/S模式) 1网络程序的通用体系结构 客户端服务器方式所描述的是进程之间服务和被服务的 关系。主机A运行客户端程序而主机B运行服务器程序。两个人希望通过电话进行沟通,需要满足哪些条件?l1)对拨打电话的一方有什么要求?l2)被拨打的电话有什么要求?l3)如

4、果被拨打的电话无人接听,怎么处 理?l4)对拨打电话和被拨打电话的人有什么 语言上的要求?l5)通话过程中,对物理线路有何要求?l6)如何挂断电话?基于TCP的网络应用程序通信过程l1)客户端需了解服务器的地址和端口l2)服务器应用程序必须比客户端应用程序先启 动,并在指定的ip地址和端口上执行监听操作 。l3)客户端发送数据时,服务端应用程序必须有 足够的时间响应才能进行正常通信。l4)双方必须采用相同协议l5)通信过程中,物理网络保持畅通l6)通信结束之前,客户端和服务端都可以中断 连接2最简单的Socket通信流程 这里先来考虑一个只有客户端向服务方发信息的单向通信 ,并且也只有客户端会

5、主动提出断开连接的最简单的情形(相 反过程的原理是一样的),其双方Socket之间的关系如图所 示。由上面这个过程很容易得出对应的Socket通信流程。1对象分析 若要实现上节分析的Socket通信流程共需要三个套接字对象:客户端一个( 称为“客户Socket”);服务器两个(一个用于监听,称为“监听Socket”;另一个用 于接收客户发来的信息,称为“服务Socket”)。这三个套接字对象对应三个 Socket类,都继承自CAsyncSocket,分别为它们取名如表2.2所示(表中的类名 也是后面程序中需要使用的)。Socket对象类 名 客户户SocketCClientSocket 监监听

6、SocketCListenSocket 服务务SocketCServerSocket案例:使用CAsyncSocket类实现网络通信1.工程设计 1)分别做客户端和服务端客户端:ChatClient工程服务端:ChatServer工程案例:使用CAsyncSocket类实现网络通信2界面设计-客户端案例:使用CAsyncSocket类实现网络通信2界面设计-服务端案例:使用CAsyncSocket类实现网络通信3.给各个必要控件添加变量 客户端服务端案例:使用CAsyncSocket类实现网络通信4.添加相关类并增加对象 客户端 CClientSocket:其基类为:CAsyncSocket

7、服务端 ClistenSocket:其基类为:CAsyncSocket CServerSocket:其基类为:CAsyncSocket案例:使用CAsyncSocket类实现网络通信4.添加相关类并增加对象 客户端 CClientSocket m_ClientSocket; 服务端 CListenSocket m_ListenSocket; CServerSocket m_ServerSocket;案例:使用CAsyncSocket类实现网络通信5.编写详细代码 1)服务器端创建监听socket。 编程思路: 获取对话框上输入的IP地址和端口号使用Create函数创建一个套接字使用Listen

8、函数设置套接字开始监听在列表框中显示“开始监听”字样案例:使用CAsyncSocket类实现网络通信Create函数使用方法: CAsyncSocket类的对象名.Create(端口号 ,套接字类型,事件类型,ip地址)其中:套接字类型可取值为SOCK_STREAM或 SOCK_DGRAM,分别指流式套接字和数据报套接字。 事件类型:可取值为FD_READ,FD_WRITE, FD_OOB,FD_ACCEPT,FD_CONNECT, FD_CLOSE 。案例:使用CAsyncSocket类实现网络通信Listen函数使用方法: CAsyncSocket类的对象名. Listen(挂起的 连接队

9、列可以增大到的最大长度)参数取值范围为1-5案例:使用CAsyncSocket类实现网络通信列表框中增加一行字符串: 列表框绑定的control类别变量的名称 .AddString(“所要增加的字符串”);案例:使用CAsyncSocket类实现网络通信#include “ListenSocket.h“#include “ServerSocket.h“/下面这两行放在CServerSocketDlg类的public部分CListenSocket m_ListenSocket;CServerSocket m_ServerSocket;案例:使用CAsyncSocket类实现网络通信void CC

10、hatServerDlg:OnBTNStartlisten() BYTE nFild4; CString sIP,sP; UpdateData(); m_ServerIp.GetAddress(nFild0,nFild1,nFild2,nFild3); sIP.Format(“%d.%d.%d.%d“,nFild0,nFild1,nFild2,nFild3); sP.Format(“%d“,m_sPort); m_ListenSocket.Create(m_sPort,1,FD_ACCEPT,sIP); m_ListenSocket.Listen(1); m_ListWords.AddStri

11、ng(“在“+sIP+“:“+sP+“监听.“); 案例:使用CAsyncSocket类实现网络通信5.编写详细代码 2)客户端创建客户socket并发起连接。 编程思路: 获取对话框上输入的IP地址和端口号使用Create函数创建一个套接字使用Connect函数实现与服务器的连接如果成功,在列表框中显示“连接成功”字样案例:使用CAsyncSocket类实现网络通信Connect函数使用方法 CAsyncSocket类的对象名. Connect(ip地 址,端口号);案例:使用CAsyncSocket类实现网络通信void CChatClientDlg:OnBTNConnect() BYTE

12、 nFild4; CString sIP; UpdateData(); m_ServerIp.GetAddress(nFild0,nFild1,nFild2,nFild3 ); sIP.Format(“%d.%d.%d.%d“,nFild0,nFild1,nFild2, nFild3); m_ClientSocket.Create(); m_ClientSocket.Connect(sIP,m_sPort); 添加CClientSocket的OnConnect虚函数添加CClientSocket的OnConnect虚函数添加CClientSocket的OnConnect虚函数void CCli

13、entSocket:OnConnect(int nErrorCode) if(nErrorCode) AfxMessageBox(“连接失败!请重试!“); return; (CChatClientDlg*)(AfxGetApp()- m_pMainWnd)-m_ListWords.AddString(“ 连接成 功.“); 案例:使用CAsyncSocket类实现网络通信5.编写详细代码 3)客户端连接服务端成功后发送信息。 编程思路: 获取对话框上输入的信息使用Send函数实现信息的发送在列表框中显示发送的信息内容void CChatClientDlg:OnBTNSend() Update

14、Data(); m_ClientSocket.Send(m_sWords,m_sWord s.GetLength(); m_ListWords.AddString(“发送: “+m_sWords); GetDlgItem(IDC_MESSAGE)- SetWindowText(“); 案例:使用CAsyncSocket类实现网络通信5.编写详细代码 4)服务端socket等待客户发来的消息并接 受。 编程思路: 接收客户端的连接请求接收客户端发来的信息在列表框中显示相关信息具体实现1)添加CListenSocket的OnAccept的虚 函数实现接收客户端的连接请求 2)添加CServerSo

15、cket的OnReceive的虚 函数实现接收客户端发来的信息案例:使用CAsyncSocket类实现网络通信关闭连接和退出。 请写出双向通信的程序。1非指针程序的机制缺陷前面的程序存在以下缺陷: 1)Socket的创建、使用和销毁不灵活。2)程序代码分散。如服务端就有 CListenSocket和CServerSocket两个类的基类 是CAsyncSocket。1非指针程序的机制缺陷前面的程序存在以下缺陷: 3)代码可读性差。 如果在Socket的代码中要访问和控制主对话框界面上的控件, 则需要运用AfxGetApp()全局函数获取主窗口CWinApp类指针 ,这意味着每一个在Socket

16、中访问到主界面控件的语句前都要写上冗长的类似下面的这句代码:(CChatClientDlg*)(AfxGetApp()-m_pMainWnd)-2用对话框指针机制实现的Socket程序 (1)建立工程。 分别创建客户端和服务器工程,客户和服务器工程中各添 加一个基于CAsyncSocket类的MySocket类,这个类是用来 为通信双方动态生成Socket对象服务的。补充技巧因为界面与原来的两个工程的界面一样,可以在原来工程的 基础上进行修改。 修改步骤如下。 1)找到类所涉及的文件并删除(包含.h和.cpp文件) 2)删除扩展名为clw的文件 3)打开扩展名为dsp的文件(文本编辑工具),删除和要删 除的类相关的条目 4)使用vc打开dsw文件,然后打开建立类向导,点确定 5)重新编译文件,把相关代码删除 6)如还有错,可把debug文件夹下的内容删除,全部

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号