网络编程技术(西电课件)_第4章(net版本).ppt_第1页
网络编程技术(西电课件)_第4章(net版本).ppt_第2页
网络编程技术(西电课件)_第4章(net版本).ppt_第3页
网络编程技术(西电课件)_第4章(net版本).ppt_第4页
网络编程技术(西电课件)_第4章(net版本).ppt_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络编程技术 第四章Windows的MFC编程介绍 现有知识 我们能做什么 1 TCP端口扫描器 connect方式 2 ICMP主机扫描器 Echo方式 3 TCP端口扫描器 SYN方式 4UDP端口扫描器 TCP端口扫描器 Connect 实现原理 利用流式套接字 调用函数connect 连接到目标计算机的某端口 完成一次完整的三次握手过程 如果端口处于侦听状态 那么connect 就能成功返回 否则 这个端口不可用 即没有提供服务 优点 稳定可靠 不需要特殊的权限缺点 扫描方式不隐蔽 服务器日志会记录下大量密集的连接和错误记录 并容易被防火墙发现和屏蔽 ICMP主机扫描器 Echo方式 实现原理 利用原始套接字构造数据包 向目标主机发送ICMPEchoRequest type8 数据包 等待回复的ICMPEchoReply包 type0 如果能收到 则表明目标系统可达 否则表明目标系统已经不可达或发送的包被对方的设备过滤掉 优点 简单 系统支持缺点 很容易被防火墙限制可以通过并行发送 同时探测多个目标主机 以提高探测效率 ICMPSweep扫描 TCP端口扫描器 SYN 实现原理 利用原始套接字构造数据包 向目标主机端口发送SYN包 如果应答是RST包 那么说明端口是关闭的 如果应答中包含SYN和ACK包 说明目标端口处于监听状态 再传送一个RST包给目标机从而停止建立连接 优点 隐蔽性较全连接扫描好 一般系统对这种半扫描很少记录缺点 通常构造SYN数据包需要超级用户或者授权用户访问专门的系统调用 UDP端口扫描器 实现原理 利用数据报套接字构造数据包 向目标主机某端口发送UDP包 如果收到ICMP的目标端口不可达的错误提示包 表示端口关闭 否则可能是端口开启或有防火墙拦截 优点 针对关闭的端口缺点 不能确定端口开启或有防火墙情况 且UDP扫描速度通常较慢 思考题 MFC是什么 为什么要用 MicrosoftFoundationClasses 第4章WindowsMFC编程介绍 1 WindowsAPI编程2 Windows应用程序的组成与编程3 WindowsMFC编程 1 WindowsAPI编程 WindowsAPI编程介绍窗口事件驱动句柄消息Windows应用程序的常用消息 1 1WindowsAPI编程介绍 Windows编程的方法主要有两种方法 传统编写法 利用API函数 交互式方法 利用MFC类库 为使程序员编写具有Windows风格的应用程序 Windows提供了一个应用程序编程接口 ApplicationProgrammingInterface 简称API 它是Windows系统与Windows应用程序间的标准程序接口 上千个API函数包含了各种窗口类和系统资源 API可以为应用程序提供Windows系统特殊函数及数据结构 Windows应用程序可以利用大量API函数调用系统功能 MFC MFC MicrosoftFoundationClassLibrary 微软基础类库 约有200个类 MFC封装了大部分API函数 并提供了一个应用程序框架 简化了和标准化了Windows程序设计 但WindowsAPI编程方法始终是Windows编程的基础 APIVSMFC 哪个有优势 我们待会来看先明确Windows窗口编程有些什么要素 1 2窗口 编写一个Windows应用程序首先应创建一个或多个窗口 而后应用程序的运行过程即是窗口内部 窗口与窗口之间 窗口与系统之间进行数据处理与数据交换的过程 需要设置和处理的地方很多 1 2窗口 示例 1 3事件驱动 在Windows环境下 应用程序启动后 系统等待用户在图形用户界面内的输入选择 如鼠标按键 键盘按键 窗口被创建 关闭 改变大小 移动等 对系统来说 这都是事件 事件 对象可以识别的一个动作 例如 按下鼠标 按下 释放键盘键等 Windows应用程序的执行顺序取决于事件的发生顺序 事件驱动 当一个事件发生时 系统会产生一条特定的消息 以标识该事件的发生 消息 传递信息或请求的数据包 例如 在窗口客户区按下鼠标左键时 将产生一条WM LBUTTONDOWN消息 该消息包含虚键是否按下 光标坐标等信息 并非所有的消息都是由事件产生 有些消息是由系统发出的 有些消息是由函数调用产生的 WM PAINT消息是由系统发出的 调用PostQuitMessage 会产生一条WM QUIT消息 Windows程序的设计重点是编写消息处理代码 事件驱动编程方法对于编写交互式程序很有用处 它避免了死板的操作模式 1 3事件驱动 事件 孩子挨爸爸打消息 孩子喊叫消息处理 妈妈收到消息后的某种反应 事件 单击按钮消息 BN CLICKED消息处理 编码实现在编辑框内显示 HelloWorld 事件驱动举例 1 4句柄 句柄 顾名思义 指的是一个Windows对象的把柄 Windows中的句柄都是32位的指针变量 用来指向某个Windows对象所占据的内存区 句柄的使用 极大地方便了Windows管理其内存中的各种Windows对象 常用句柄类型及其说明 1 5消息 消息是描述事件发生的信息 Windows应用程序通过消息进行信息交换 在Windows中 消息用结构体MSG表示 其结构如下 TypedefstructtagMSG HWNDhwnd 窗口句柄UNITmessage 消息号 WPARAMwParam 用于提供消息的附加消息 LPARAMlParam 用于提供消息的附加消息 DWORDtime 指定消息送至队列的时间POINTpt 指定消息发送时屏幕光标的位置 MSG 消息队列和在应用程序中的轮询处理 VC 中存在几种系统定义的消息分类 不同的前缀符号经常用于识别消息的分类 如下表所示 1 6Windows应用程序的常用消息 1 鼠标消息 主要有 WM LBUTTONDOWN 产生单击鼠标左键的消息 WM LBUTTONUP 放开鼠标左键时产生的消息 2 键盘消息 主要有 WM KEYDOWN 按下一个系统键时产生的消息 WM KEYUP 放开一个系统键时产生的消息 3 窗口消息 主要有 WM CREATE 窗口创建时 由CreateWindows函数发出的消息 WM CLOSE 关闭窗口时产生的消息 WM QUIT 退出应用程序时 由PostQuitMessage函数发出消息 2 Windows应用程序的组成与编程 典型的Windows程序结构入口函数WinMain 窗口函数WinProc Windows应用程序的常用数据类型API编程实例 2 1典型的Windows程序结构 Windows应用程序的主体由以下两个函数完成 WinMain 函数负责建立窗口和建立消息循环 WinProc 函数负责消息的处理 2 1典型的Windows程序结构 2 2入口函数WinMain WinMain 函数类似C语言中的Main函数 是Win32应用程序入口函数 WinMain 函数主要完成创建主窗口 并产生和处理消息循环 WinMain 函数 因为Windows是多任务系统 所以同一应用程序的多个窗口可能会同时存在 Windows系统对每个窗口的执行称为一个实例 用一个实例句柄来唯一标识 WinMain 函数与DOS程序的main 函数起同样的作用 有一点不同的是 WinMain 函数必须带有四个参数 它们是系统传递给它的 WinMain 函数的原型如下 intWINAPIWinMain HINSTANCEhInstance 当前实例句柄HINSTANCEhPrevInstance 前一个实例句柄LPSTRlpCmdLine 命令行字符intnCmdShow 窗口显示方式 WinMain 函数 第一个参数hInstance 是标识该应用程序当前实例的句柄 第二个参数是hPrevInstance 它是用来标识该应用程序的前一个实例的句柄 第三个参数是lpCmdLine 是指向应用程序命令行参数字符串的指针 最后一个参数是nCmdShow 是一个用来指定窗口显示方式的整数 这个整数值可以是SW SHOW SW HIDE SW SHOWMAXIMIZED SW SHOWMINIMIZED等 WinMain 函数主要由2部分组成 窗口初始化消息循环 窗口初始化包括以下主要步骤 定义窗口类 通过给窗口类数据结构WINDCLASS赋值 设置窗口类的各种属性 如窗口边框 窗口标题栏文字 窗口大小和位置 鼠标 背景色等 注册窗口类 Win系统本身提供部分预定义的窗口类 程序员也可以自定义窗口类 窗口类必须先注册后使用 窗口类的注册由函数RegisterClass 实现 创建窗口实例 创建窗口类的实例由CreateWindows 函数实现 窗口显示 窗口类的显示是由ShowWindows 函数和UpdateWindows 函数实现的 ShowWindows 函数 应用程序通过调用此函数在屏幕上显示窗口 UpdateWindows 函数 显示窗口后 应用程序调用此函数更新并绘制用户区 并发出WM PAINT消息 消息循环 Windows为当前执行的每个Windows程序维护一个 消息队列 在发生输入事件之后 Windows将事件转换为一个 消息 并将消息放入程序的 消息队列 中 程序通过执行一块称之为 消息循环 的程序代码从消息队列中取出消息 以下是WinMain 函数中消息循环的代码 消息循环以调用GetMessage 开始 它从消息队列中取出 一个消息while GetMessage WinMain 函数的大致结构 intWINAPIWinMain 定义窗口类 WNDCLASSwndclass wndclass style CS HREDRAW CS VREDRAW 十个字段wndclass lpszClassName AAA 注册窗口类 RegisterClass 2 3窗口函数WndProc 窗口函数WndProc 就是Windows应用程序的消息处理程序 窗口函数WndProc 定义了应用程序对接收到的不同消息的响应 包含了对各种可能接收到的消息的处理过程 WndProc函数由一个或多个switch语句组成 每一条case语句对应一种消息 当应用程序接收到一个消息时 相应的case语句被激活并执行相应的响应程序模块 窗口消息处理程序不予处理的所有消息被传给名为DefWindowProc的Windows函数进行默认处理 消息处理函数WndProc的大致结构 LRESULTCALLBACKWndProc HWNDhMainwnd UINTmessage WPARAMwParam LPARAMlParam 窗口函数的定义 switch message caseWM KEYDOWN 击键消息 break case break caseWM DESTROY 关闭应用程序窗口时发出的消息 PostQuitMessage 0 发出WM QUIT消息 结束应用程序return0 default break 调用缺省消息处理过程returnDefWindowProc hMainwnd message wParam lParam 2 4Windows应用程序的常用数据类型 2 5API编程实例 所有的Windows应用程序中 都有一个程序初始化的过程 下面以一个实现最简单功能的程序WinApiDemo为例 说明Windows程序的基本框架 操作步骤如下 1 打开VisualC Net 选择 文件 菜单的 新建 在出现的菜单中 选择 项目 在弹出的窗口点取 空项目 2 在 位置 中填入工程的路径 然后在 名称 中填入 WinApiDemo 其它按照缺省设置 单击OK按钮 3 在解决方案资源管理器 右键点击项目名称 在出现的菜单上选择 添加 再选择 新建项 在弹出的窗口中 选择 C 文件 表示新建一个C 源文件 点击 添加 4 在 WinApiDemo cpp 文件中输入以下程序代码 抓图1 新建项目 抓图2 选空项目 输入位置和名称 抓图3 添加新建项 抓图4 添加新建项 WinApiDemo cpp源代码 1 include 头文件LRESULTCALLBACKWndProc HWND UINT WPARAM LPARAM 窗口函数声明 这一函数将处理发往应用程序窗口的各种消息charszClassName windowclass 窗口结构体的名称charszAppTitle API建立窗口实例 窗口的标题intWINAPIWinMain HINSTANCEhInstance HINSTANCEhPrevInstance LPSTRlpszCmdParam intnCmdShow WinMain 函数的定义 HWNDhMainWnd 窗口句柄MSGmsg 消息结构体WNDCLASSwinclass 窗口结构体 WinApiDemo cpp源代码 2 if hPrevInstance winclass style CS HREDRAW CS VREDRAW 窗口风格winclass lpfnWndProc WndProc 指明消息处理过程winclass cbClsExtra 0 附加参数winclass cbWndExtra 0 附加参数winclass hInstance hInstance 当前应用程序实例句柄winclass hIcon LoadIcon NULL IDI APPLICATION 窗口图标winclass hCursor LoadCursor NULL IDC ARROW 窗口光标winclass hbrBackground HBRUSH GetStockObject LTGRAY BRUSH 窗口背景色为浅灰色winclass lpszMenuName NULL 窗口菜单winclass lpszClassName LPCSTR szClassName 给窗口结构体命名 CreateWindow 函数将根据窗口结构体的名称来建立窗口RegisterClass 注册窗口 WinApiDemo cpp源代码 3 下面用CreateWindow 函数来建立窗口 并返回所建立窗口的句柄hMainWnd CreateWindow LPCSTR szClassName 窗口结构体的名称LPCSTR szAppTitle 窗口的标题WS OVERLAPPEDWINDOW 窗口风格为可重叠窗口 下面四个参数代表窗口左上角x y坐标和窗口的宽度与高度 都使 用缺省值CW USEDEFAULT CW USEDEFAULT CW USEDEFAULT CW USEDEFAULT 下面参数分别为父窗口句柄 窗口菜单句柄 应用程序实例句柄 和附加参数NULL NULL hInstance NULL ShowWindow hMainWnd SW SHOWNORMAL 显示最大化窗口UpdateWindow hMainWnd 更新窗口 下面用While 循环来建立消息循环while GetMessage WinApiDemo cpp源代码 4 LRESULTCALLBACKWndProc HWNDhMainwnd UINTmessage WPARAMwParam LPARAMlParam 窗口函数的定义 switch message caseWM KEYDOWN 击键消息 MessageBox hMainwnd LPCSTR 键按下了 LPCSTR Keyboard MB OK break caseWM RBUTTONDOWN 鼠标消息 MessageBox hMainwnd LPCSTR 鼠标右键按下了 LPCSTR Mouse MB OK break caseWM LBUTTONDOWN 鼠标消息 MessageBox hMainwnd LPCSTR 鼠标左键按下了 LPCSTR Mouse MB OK break caseWM DESTROY 关闭应用程序窗口时发出的消息 PostQuitMessage 0 发出WM QUIT消息 结束应用程序return0 default break 调用缺省消息处理过程returnDefWindowProc hMainwnd message wParam lParam WinApiDemo的运行画面 3 WindowsMFC编程 为什么需要MFCMFC概述和发展历史MFC的优势MFC类结构以及一些基础类的介绍MFC的使用类向导的介绍和使用 3 1为什么需要MFC 微软基础类库 利用WindowsAPI开发程序的用户有这样的体会 即使开发一个简单的Windows应用程序也需要对Windows的编程原理有很深刻的认识 需要手工编写冗长的代码 由于程序的出错率是随着代码长度的增加呈几何级数增长的 而且当程序长度逐渐膨胀时 调试程序会变得越来越困难 因此 传统的Windows应用程序设计需要程序员有极大的耐心和丰富的编程经验 微软在VisualC 捆绑了MFC基础类库 编程时我们就可以利用类的可重用性和可扩充性 大大降低Windows应用程序设计的难度和工作量 3 2MFC概述 类库是一个可以在应用程序中使用的相互关联的C 类的集合 MFC作为一个Windows编程类库 它包含了200多个类 封装了Windows的大部分编程对象以及与它们有关的操作 虽然程序在功能上千差万别 但从本质上看 都可以分为用户界面设计 文件操作 数据库访问及多媒体使用等几部分 这些都可以通过一些类来实现 MFC提供了一个标准化的程序结构 使开发人员不必从头设计一个Windows应用程序 MFC实际上是一个庞大的文件库 它由几百个执行文件和源代码文件 如H文件 组成 MFC的发展历史 MFC9 0 VC NET2008 3 3采用MFC编程的优势 使用标准化的程序代码结构 有利于程序员之间的交流VisualC 为MFC提供了大量的工具支持 提高了编程效率 如VC6 0利用MFCAppWizard创建MFC应用程序框架 利用ClassWizard方便地对Windows消息进行管理 VC Net更为方便 MFC应用程序的效率较高 只比传统的WindowsC程序低5 左右 并且 在MFC应用程序中还允许混合使用传统的WindowsAPI函数 其它优势 完全支持Windows所有的函数 控件 消息 菜单及对话框 具有良好的稳定性和可移植性 更符合微软的风格等 MFC还很好地保持了程序的向下兼容性 是用来编写Windows应用程序的C 类集 提供了大量的基类供程序员根据不同的应用环境进行扩充 允许在编程过程中自定义和扩展应用程序中的类 较好的移植性 可移植于众多的平台 3 4MFC类的组织结构 MFC库中的类按层次关系划分类 1 根类 CObject 2 应用程序体系结构类 3 窗口 对话框和控件类 4 绘图和打印类 5 简单数据类型类 6 数组 列表和映射类 7 文件和数据库类 8 Internet和网络工作类 9 OLE类 10 调试和异常类 54 CObject是MFC中多数类和用户自定义子类的根类 是抽象基类 它提供了许多编程所需的公共操作 简单数据类型类 55 应用程序体系结构类的层次图 应用程序体系结构类 57 58 可视对象类 59 1 窗口类 CWnd类 CWnd提供了MFC中所有窗口类的基本功能 是CCmdTarget类的子类 60 61 通用类 63 此类提供了许多通用服务 例如文件I O 诊断和异常处理等 此外还包括如数组和列表等存放数据集的类 1 文件类 CFile类和CArchive类 用以编写输入输出处理函数 2 异常类 CException类 是所有异常情况的基类 不能直接建立CException对象 只能建立派生类的对象 用派生类来捕获指定的异常情况 3 模板收集类 这些类可以将多种对象存放到数组 列表和 映射 中 但这些收集类是模板 它们的参数确定了存放在集合中的对象类型 回顾最基本的Socket 有了套接字工具 能做什么 建立通信设备之间的数字通道网络探测工具 例如各类扫描器网络攻击工具 例如各种漏洞攻击的toolkit 最近的项目 远程控制类型不确定的设备多通道抗DDOS攻击的通信技术 MFC的使用 MFC的使用 应用程序向导 68 70 71 72 73 77 MFC应用程序中的文件 1 用记事本打开这个sln文件看 写明了项目ID和目录Project 8BC9CEB8 8B4A 11D0 8D11 00A0C91BC942 MFCtest MFCtest MFCtest vcproj 928AB0F2 F873 4E18 91F0 71B08AB2F9E7 EndProject 78 MFC应用程序中的文件 2 用记事本打开这个vcproj文件看 说明了debug和release两种编译方式采取的编译设置说明了头文件 h 源程序 cpp 资源文件 rc ico 利用MFC来管理类 point h classCPoint private intX intY public CPoint intx 0 inty 0 voidShow include point h CPoint CPoint intx 0 inty 0 X x Y y voidCPoint Show cout X Y point cpp voidf voidCPoint f 添加代码 MFC管理类的方式 类视图的使用 利用MFC应用程序向导生成应用程序框架后 需要为程序添加消息处理成员函数和成员变量 有时还需要为程序添加新的MFC派生类 那么这些可以通过类视图右键点击来实现 经典VC6 0以MFCClassWizard类向导来实现 现在VC Net要便利很多 给项目增加类 给项目中某个类添加变量和函数 添加变量 添加控件变量 添加函数 利用MFC进行事件处理 添加其他事件处理函数 添加其他事件处理函数 消息发送和消息处理的一般过程为 消息发送 消息映射 消息处理 消息映射区 BEGIN MESSAGE MAP CMFCtestDlg CDialog ON WM SYSCOMMAND ON WM PAINT ON WM QUERYDRAGICON AFX MSG MAPON BN CLICKED IDOK CMFCtestDlg OnBnClickedOk ON

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论