《MFCSocket编程》PPT课件.ppt

上传人:sh****n 文档编号:8633298 上传时间:2020-03-30 格式:PPT 页数:81 大小:2.78MB
返回 下载 相关 举报
《MFCSocket编程》PPT课件.ppt_第1页
第1页 / 共81页
《MFCSocket编程》PPT课件.ppt_第2页
第2页 / 共81页
《MFCSocket编程》PPT课件.ppt_第3页
第3页 / 共81页
点击查看更多>>
资源描述
第2章MFCSocket编程 MFC及其Socket类 Socket类网络编程 Socket程序的互通 2 1MFC及其Socket类 2 1 1MFC简介MFC是很庞大的 以VisualC 6 0所带的MFC4 21为例 已经包含了多达上百个类 结构和接口 2 1 1MFC简介 该层次结构可分为如下几种不同的类型 应用程序框架 图形绘制的绘制对象 文件服务 异常处理 结构 如Lists Arrays和Maps Internet服务 OLE2 数据库 2 1 2MFC中的Socket类 1 CAsyncSocket类CAsyncSocket类是从MFC的根类CObject派生出来的 它在较低的级别上封装WindowsSocketAPI 因此类中包含的大部分成员函数和底层WinsockAPI函数有很多相似之处 有的甚至连名称和参数叫法都是相同或相近的 2 1 2MFC中的Socket类 2 CSocket类及其相关类 1 CSocket类 CSocket类是从CAsyncSocket类派生而来的 它继承了CAsyncSocket对WindowsSocketAPI的封装 与CAsyncSocket对象相比 CSocket对象代表了WindowsSocketAPI的更高一级的抽象化 2 1 2MFC中的Socket类 2 CSocket与CArchive CSocketFile类的配合使用 使用CSocket类编写网络程序 既可以使用如CAsyncSocket类网络程序一样的Send和Receive函数来收发信息 也可以与CSocketFile类和CArchive类一起管理数据的发送和接收 补充 CString与string string为标准模板类 STL 定义的字符串类 在标准c 或者跨平台使用程序中建议使用 CString均是字符串模板类 在MFC或者ATL中实现 在使用mfc编程时建议使用CString 2 2Socket类网络编程 2 2 1客户端 服务器方式 C S模式 1 网络程序的通用体系结构客户端 服务器方式所描述的是进程之间服务和被服务的关系 主机A运行客户端程序而主机B运行服务器程序 两个人希望通过电话进行沟通 需要满足哪些条件 1 对拨打电话的一方有什么要求 2 被拨打的电话有什么要求 3 如果被拨打的电话无人接听 怎么处理 4 对拨打电话和被拨打电话的人有什么语言上的要求 5 通话过程中 对物理线路有何要求 6 如何挂断电话 基于TCP的网络应用程序通信过程 1 客户端需了解服务器的地址和端口2 服务器应用程序必须比客户端应用程序先启动 并在指定的ip地址和端口上执行监听操作 3 客户端发送数据时 服务端应用程序必须有足够的时间响应才能进行正常通信 4 双方必须采用相同协议5 通信过程中 物理网络保持畅通6 通信结束之前 客户端和服务端都可以中断连接 2 2 1客户端 服务器方式 C S模式 2 最简单的Socket通信流程这里先来考虑一个只有客户端向服务方发信息的单向通信 并且也只有客户端会主动提出断开连接的最简单的情形 相反过程的原理是一样的 其双方Socket之间的关系如图所示 2 2 1客户端 服务器方式 C S模式 由上面这个过程很容易得出对应的Socket通信流程 2 2 2CAsyncSocket类编程基础 1 对象分析若要实现上节分析的Socket通信流程共需要三个套接字对象 客户端一个 称为 客户Socket 服务器两个 一个用于监听 称为 监听Socket 另一个用于接收客户发来的信息 称为 服务Socket 这三个套接字对象对应三个Socket类 都继承自CAsyncSocket 分别为它们取名如表2 2所示 表中的类名也是后面程序中需要使用的 案例 使用CAsyncSocket类实现网络通信 1 工程设计1 分别做客户端和服务端客户端 ChatClient工程服务端 ChatServer工程 案例 使用CAsyncSocket类实现网络通信 2界面设计 客户端 案例 使用CAsyncSocket类实现网络通信 2界面设计 服务端 案例 使用CAsyncSocket类实现网络通信 3 给各个必要控件添加变量客户端服务端 案例 使用CAsyncSocket类实现网络通信 4 添加相关类并增加对象客户端CClientSocket 其基类为 CAsyncSocket服务端ClistenSocket 其基类为 CAsyncSocketCServerSocket 其基类为 CAsyncSocket 案例 使用CAsyncSocket类实现网络通信 4 添加相关类并增加对象客户端CClientSocketm ClientSocket 服务端CListenSocketm ListenSocket CServerSocketm ServerSocket 案例 使用CAsyncSocket类实现网络通信 5 编写详细代码1 服务器端创建监听socket 编程思路 获取对话框上输入的IP地址和端口号 使用Create函数创建一个套接字 使用Listen函数设置套接字开始监听 在列表框中显示 开始监听 字样 案例 使用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 挂起的连接队列可以增大到的最大长度 参数取值范围为1 5 案例 使用CAsyncSocket类实现网络通信 列表框中增加一行字符串 列表框绑定的control类别变量的名称 AddString 所要增加的字符串 案例 使用CAsyncSocket类实现网络通信 include ListenSocket h include ServerSocket h 下面这两行放在CServerSocketDlg类的public部分CListenSocketm ListenSocket CServerSocketm ServerSocket 案例 使用CAsyncSocket类实现网络通信 voidCChatServerDlg OnBTNStartlisten BYTEnFild 4 CStringsIP sP UpdateData m ServerIp GetAddress nFild 0 nFild 1 nFild 2 nFild 3 sIP Format d d d d nFild 0 nFild 1 nFild 2 nFild 3 sP Format d m sPort m ListenSocket Create m sPort 1 FD ACCEPT sIP m ListenSocket Listen 1 m ListWords AddString 在 sIP sP 监听 案例 使用CAsyncSocket类实现网络通信 5 编写详细代码2 客户端创建客户socket并发起连接 编程思路 获取对话框上输入的IP地址和端口号 使用Create函数创建一个套接字 使用Connect函数实现与服务器的连接 如果成功 在列表框中显示 连接成功 字样 案例 使用CAsyncSocket类实现网络通信 Connect函数使用方法CAsyncSocket类的对象名 Connect ip地址 端口号 案例 使用CAsyncSocket类实现网络通信 voidCChatClientDlg OnBTNConnect BYTEnFild 4 CStringsIP UpdateData m ServerIp GetAddress nFild 0 nFild 1 nFild 2 nFild 3 sIP Format d d d d nFild 0 nFild 1 nFild 2 nFild 3 m ClientSocket Create m ClientSocket Connect sIP m sPort 添加CClientSocket的OnConnect虚函数 添加CClientSocket的OnConnect虚函数 添加CClientSocket的OnConnect虚函数 voidCClientSocket OnConnect intnErrorCode if nErrorCode AfxMessageBox 连接失败 请重试 return CChatClientDlg AfxGetApp m pMainWnd m ListWords AddString 连接成功 案例 使用CAsyncSocket类实现网络通信 5 编写详细代码3 客户端连接服务端成功后发送信息 编程思路 获取对话框上输入的信息 使用Send函数实现信息的发送 在列表框中显示发送的信息内容 voidCChatClientDlg OnBTNSend UpdateData m ClientSocket Send m sWords m sWords GetLength m ListWords AddString 发送 m sWords GetDlgItem IDC MESSAGE SetWindowText 案例 使用CAsyncSocket类实现网络通信 5 编写详细代码4 服务端socket等待客户发来的消息并接受 编程思路 接收客户端的连接请求 接收客户端发来的信息 在列表框中显示相关信息 具体实现 1 添加CListenSocket的OnAccept的虚函数实现接收客户端的连接请求2 添加CServerSocket的OnReceive的虚函数实现接收客户端发来的信息 案例 使用CAsyncSocket类实现网络通信 关闭连接和退出 请写出双向通信的程序 2 2 3CAsyncSocket类程序的指针实现 1 非指针程序的机制缺陷前面的程序存在以下缺陷 1 Socket的创建 使用和销毁不灵活 2 程序代码分散 如服务端就有CListenSocket和CServerSocket两个类的基类是CAsyncSocket 2 2 3CAsyncSocket类程序的指针实现 1 非指针程序的机制缺陷前面的程序存在以下缺陷 3 代码可读性差 如果在Socket的代码中要访问和控制主对话框界面上的控件 则需要运用AfxGetApp 全局函数获取主窗口CWinApp类指针 这意味着每一个在Socket中访问到主界面控件的语句前都要写上冗长的类似下面的这句代码 CChatClientDlg AfxGetApp m pMainWnd 2 2 3CAsyncSocket类程序的指针实现 2 用对话框指针机制实现的Socket程序 1 建立工程 分别创建客户端和服务器工程 客户和服务器工程中各添加一个基于CAsyncSocket类的MySocket类 这个类是用来为通信双方动态生成Socket对象服务的 补充技巧 因为界面与原来的两个工程的界面一样 可以在原来工程的基础上进行修改 修改步骤如下 1 找到类所涉及的文件并删除 包含 h和 cpp文件 2 删除扩展名为clw的文件3 打开扩展名为dsp的文件 文本编辑工具 删除和要删除的类相关的条目4 使用vc打开dsw文件 然后打开建立类向导 点确定5 重新编译文件 把相关代码删除6 如还有错 可把debug文件夹下的内容删除 全部重建即可 关于指针 CChatClientDlg m dlg CChatClientDlgm dlg CAboutDlgdlg dlg DoModal CAboutDlg dlg dlg newCAboutDlg dlg DoModal 指针形式实现 关于指针 1 如何对指针进行初始化int p 请写出对应的给指针初始化语句 程序结构分析 主对话框类和mysocket类主对话框中实现基本的按钮消息等功能Mysocket类中需重载对应的虚函数 2 2 3CAsyncSocket类程序的指针实现 2 用对话框指针机制组织新程序的框架 在MySocket h中添加如下代码 classCChatClientDlg 为了能够在MySocket类中定义主对话框类指针 首先对主对话框类进行前导声明CChatClientDlg m dlg 在MySocket类中定义一个主对话框指针voidGetDlg CChatClientDlg dlg 获取主对话框指针的函数 2 2 3CAsyncSocket类程序的指针实现 在ChatClientDlg h中添加如下代码 include MySocket h MySocket m ClientSocket voidOnReceive voidOnClose voidOnConnect voidSocketReset 2 2 3CAsyncSocket类程序的指针实现 BOOLCChatClientDlg OnInitDialog m ClientSocket NULL MySocket类对象指针初始化为空returnTRUE 2 2 3CAsyncSocket类程序的指针实现 写出已声明的三个函数OnClose OnConnect OnReceive 的函数体 同时实现SocketReset 函数voidCChatClientDlg SocketReset if m ClientSocket NULL deletem ClientSocket m ClientSocket NULL 2 2 3CAsyncSocket类程序的指针实现 在MySocket cpp中实现获取主对话框指针的GetDlg 函数 并通过指针引用主对话框程序代码中的网络事件处理函数 include ChatClientDlg h voidMySocket GetDlg CChatClientDlg dlg 获得窗口界面的指针 m dlg dlg voidMySocket OnClose intnErrorCode m dlg OnClose 2 2 3CAsyncSocket类程序的指针实现 voidMySocket OnConnect intnErrorCode m dlg OnConnect voidMySocket OnReceive intnErrorCode m dlg OnReceive 2 2 3CAsyncSocket类程序的指针实现 3 代码的复制 修改 修改前面所写代码如下 连接 按钮的消息处理函数码如下 m ClientSocket newMySocket m ClientSocket GetDlg this m ClientSocket Create 创建客户端Socketm ClientSocket Connect sIP m sPort 发起连接请求 2 2 3CAsyncSocket类程序的指针实现 断开 m ClientSocket Close 关闭客户端SocketSocketReset 避免指针悬空 发送 按钮事件过程代码如下 UpdateData m ClientSocket Send m sWords m sWords GetLength 向服务器发送信息 2 2 3CAsyncSocket类程序的指针实现 因为CAsyncSocket是异步操作的Socket类 它在使用Connect方法发起连接请求后 无论连接成功与否都立即返回 我们只能根据OnConnect事件的错误码nErrorCode来判断连接是否成功 而若要获取这个错误码值 则必须进入响应OnConnect事件的处理过程 这就决定了程序员自己在主对话框中定义的函数OnConnect 的代码必须有一部分置于Socket本身的OnConnect响应函数中 2 2 3CAsyncSocket类程序的指针实现 voidMySocket OnConnect intnErrorCode 确认客户端是否成功连接到服务器if nErrorCode AfxMessageBox 连接失败 请您重试 return m dlg OnConnect CAsyncSocket OnConnect nErrorCode 2 2 3CAsyncSocket类程序的指针实现 采用与客户端类似的方法 请同学们课下完成 2 2 4CSocket类编程 编程步骤 1 构造一个CSocket对象 2 使用这个对象的Create 成员函数产生一个socket对象 3 如果是客户方套接字 则调用CAsyncSocket Connect 函数与服务方套接字连接 如果是服务方套接字 则调用Listen 开始监听来自客户方的连接请求 收到连接请求后 调用Accept 函数接受请求 建立连接 请注意Accept 成员函数需要一个新的并且为空的CSocket对象作为它的参数 2 2 4CSocket类编程 编程步骤 4 产生一个CSocketFile对象 并把它与CSocket对象关联起来 5 为接收和发送数据各产生一个CArchive对象 把它们与CSocketFile对象关联起来 切记CArchive是不能和数据报套接字一起工作的 6 使用CArchive对象的Read Write 等函数在客户与服务方传送数据 7 通讯完毕后 销毁CArchive CSocketFile和CSocket对象 2 2 4CSocket类编程 1 建立工程分别创建客户端和服务器工程 设置和前两节的程序完全一样 创建完成后分别在双方工程中各添加一个基于CSocket基类的MySocket类 2 2 4CSocket类编程 ChatClientDlg中SocketReset OnReceive OnClose MySocket中继承自CSocketonReceive intnErrorCode onClose intnErrorCode 自定义函数 GetDlg CChatClientDlg dlg MySocket m ClientSocket 客户端套接字指针CArchive m archiveIn 收到的信息的存储文件CArchive m archiveOut 发送的信息的存储文件CSocketFile m socketfile 用于发送和接受数据的缓冲区CStringm Input 接收信息用变量 1 建立程序框架 1 头文件引入及自定义函数声明在MySocket h中 include Afxsock h classCChatClientDlg CChatClientDlg m dlg voidGetDlg CChatClientDlg dlg 1 建立程序框架 1 头文件引入及自定义函数声明在ChatClientDlg h中 include MySocket h MySocket m ClientSocket 客户端套接字指针CArchive m archiveIn 收到的信息的存储文件CArchive m archiveOut 发送的信息的存储文件CSocketFile m socketfile 用于发送和接收数据的缓冲区voidOnReceive voidOnClose voidSocketReset CStringm Input 2 相关变量初始化 m ClientSocket NULL m archiveIn NULL m archiveOut NULL m socketfile NULL 思考 此初始化代码应该放在什么位置 CChatClientDlg OnInitDialog 3 相关函数的实现 1 CChatClientDlg SocketReset 回收所有指针变量占用的存储空间 并重新初始化所有指针变量为NULL 请同学们写出代码 3 相关函数的实现 2 CChatClientDlg OnReceive 接收信息处理函数 CArchive以一段内存空间作为临时数据存储地 对CArchive的读写都先依次排列到此缓冲区 当缓冲区满或用户要求时 将此段整理后的数据读写到指定的存储媒质 3 相关函数的实现 2 CChatClientDlg OnReceive 提取缓冲区中的值 强制保持在存档缓冲区的任何数据都将写入文件 设置列表框中的内容 3 相关函数的实现 3 CChatClientDlg OnClose 设置列表框中的信息 重置socket 3 相关函数的实现 4 MySocket GetDlg CChatClientDlg dlg 获取到主对话框并赋值给本类中的数据成员CChatClientDlg m dlg 请同学们写出代码 3 相关函数的实现 5 MySocket OnReceive intnErrorCode 继承CSocket类 调用主对话框类的OnReceive 函数 AsyncSelect 事件类型 选择感兴趣的事件 3 相关函数的实现 6 MySocket OnClose intnErrorCode 继承自CSocket类 调用主对话框类的OnClose 函数 4 各个按钮的功能详细实现 1 连接按钮 AfxSocketInit 必须调用 对WindowsSockets进行初始化 创建客户端socket 发起连接 如果连接失败 则提示 否则转入 显示连接成功字样 并给所需指针分配存储空间 CArchive CFile pFile UINTnMode 接收数据 CArchive load发送数据 CArchive storeCSocketFile CSocket pSocket BOOLbArchiveCompatible TRUE 一个CSocketFile对象是一个用来通过WindowsSockets在网络中发送和接收数据的CFile对象 4 各个按钮的功能详细实现 2 发送按钮 获取要发送的数据 把要发送的数据插入缓冲区 强制保持在存档缓冲区的任何数据都将写入文件 设置列表框中的信息 5 服务端程序 与客户端程序基本相似 只是需要处理传入的连接 参照源代码 2 3Socket程序的互通 2 3 1不同版本Socket程序的互通 1 CAsyncSocket客户端连接CSocket服务器 运行前面编写的传统CAsyncSocket客户端 使用指针机制的版本也一样 同时运行CSocket版的服务器 它们可以正常连接 这是因为CSocket是从CAsyncSocket派生的类 它们使用的都是同一套Socket系统 使用Connect发起连接和使用Accept接收连接 只要IP地址和端口号填写正确 就能够成功连接上 2 3 1不同版本Socket程序的互通 然后从客户端向服务器发信息 会发现服务器无法正常接收 客户端连续发4条信息服务器都没有反应 更糟的是 服务器死机 界面上的任何按钮控件都如同锁死了一般不接收用户的操作 2 3 1不同版本Socket程序的互通 单击客户端的 断开 按钮 服务器弹出出错提示 从字面上看 好像是说访问文件出错了 对于这个错误的深层机制读者暂且不用理会 但还是可以大致感性地猜猜是怎么回事 因为我们前面实现CSocket的输入 输出时是使用CArchive和CSocketFile配合将收发数据操作转换为类似文件的读 写操作 2 3 1不同版本Socket程序的互通 关闭服务器上次遗留的废弃Socket 重新建立连接后 再从服务器向客户端发信息 2 3 1不同版本Socket程序的互通 2 CSocket客户端连接CAsyncSocket服务器 将通信双方的程序版本互换一下 客户端采用CSocket版 服务器采用CAsyncSocket版 检查接下来会发生什么 客户端向服务器可以成功发送 但和前面的一样有瑕疵 收到的信息前有一个乱码字符 2 3 1不同版本Socket程序的互通 3 结论 针对上面实验结果的总结见表2 4 2 3 2接入第三方Socket程序 不做要求 有兴趣可以课下下载相关程序尝试 也可以自己写出相关程序测试 验证结果 补充 关于文件操作 CFileOpenCloseWriteRead
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!