收藏 分享(赏)

网络编程技术(西电课件)_第4章(net版本).ppt

上传人:依依 文档编号:1484850 上传时间:2018-07-22 格式:PPT 页数:124 大小:2.35MB
下载 相关 举报
网络编程技术(西电课件)_第4章(net版本).ppt_第1页
第1页 / 共124页
网络编程技术(西电课件)_第4章(net版本).ppt_第2页
第2页 / 共124页
网络编程技术(西电课件)_第4章(net版本).ppt_第3页
第3页 / 共124页
网络编程技术(西电课件)_第4章(net版本).ppt_第4页
第4页 / 共124页
网络编程技术(西电课件)_第4章(net版本).ppt_第5页
第5页 / 共124页
点击查看更多>>
资源描述

1、网络编程技术,第四章 Windows 的MFC编程介绍,现有知识-我们能做什么,1. TCP 端口扫描器(connect方式) 2. ICMP 主机扫描器(Echo方式) 3. TCP 端口扫描器(SYN方式) 4 UDP 端口扫描器,TCP 端口扫描器 (Connect),实现原理:利用流式套接字,调用函数connect()连接到目标计算机的某端口,完成一次完整的三次握手过程。如果端口处于侦听状态,那么connect()就能成功返回。否则,这个端口不可用,即没有提供服务。优点:稳定可靠,不需要特殊的权限 缺点:扫描方式不隐蔽,服务器日志会记录下大量密集的连接和错误记录 ,并容易被防火墙发现和

2、屏蔽,ICMP 主机扫描器(Echo方式),实现原理:利用原始套接字构造数据包,向目标主机发送ICMP Echo Request (type 8)数据包,等待回复的ICMP Echo Reply 包(type 0) 。如果能收到,则表明目标系统可达,否则表明目标系统已经不可达或发送的包被对方的设备过滤掉。 优点:简单,系统支持 缺点:很容易被防火墙限制 可以通过并行发送,同时探测多个目标主机,以提高探测效率(ICMP Sweep扫描)。,TCP 端口扫描器(SYN),实现原理:利用原始套接字构造数据包,向目标主机端口发送SYN包。如果应答是RST包,那么说明端口是关闭的;如果应答中包含SYN和

3、ACK包,说明目标端口处于监听状态,再传送一个RST包给目标机从而停止建立连接。优点:隐蔽性较全连接扫描好,一般系统对这种半扫描很少记录 缺点:通常构造SYN数据包需要超级用户或者授权用户访问专门的系统调用,UDP 端口扫描器,实现原理:利用数据报套接字构造数据包,向目标主机某端口发送UDP包。如果收到 ICMP的目标端口不可达的错误提示包,表示端口关闭。否则可能是端口开启或有防火墙拦截。优点:针对关闭的端口 缺点:不能确定端口开启或有防火墙情况,且UDP扫描速度通常较慢,思考题:MFC是什么?为什么要用?,Microsoft Foundation Classes,第4章 Windows MF

4、C编程介绍,1. Windows API编程 2. Windows应用程序的组成与编程 3. Windows MFC编程,1. Windows API编程,Windows API编程介绍 窗口 事件驱动 句柄 消息 Windows应用程序的常用消息,1.1 Windows API编程介绍,Windows编程的方法主要有两种方法: 传统编写法:利用API函数。 交互式方法:利用MFC类库。 为使程序员编写具有Windows风格的应用程序,Windows提供了一个应用程序编程接口(Application Programming Interface,简称API),它是Windows系统与Window

5、s应用程序间的标准程序接口。 上千个API函数包含了各种窗口类和系统资源。 API可以为应用程序提供Windows系统特殊函数及数据结构。 Windows应用程序可以利用大量API函数调用系统功能。,MFC,MFC, Microsoft Foundation Class Library,微软基础类库,约有200个类。 MFC封装了大部分API函数,并提供了一个应用程序框架,简化了和标准化了Windows程序设计。 但Windows API编程方法始终是Windows编程的基础。,API VS MFC,哪个有优势?我们待会来看先明确Windows 窗口编程有些什么要素,1.2 窗口,编写一个Wi

6、ndows应用程序首先应创建一个或多个窗口,而后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。需要设置和处理的地方很多。,1.2 窗口(示例),1.3 事件驱动,在Windows环境下,应用程序启动后,系统等待用户在图形用户界面内的输入选择,如鼠标按键、键盘按键、窗口被创建、关闭、改变大小、移动等,对系统来说,这都是事件。 事件: 对象可以识别的一个动作.例如,按下鼠标,按下/释放键盘键等. Windows 应用程序的执行顺序取决于事件的发生顺序(事件驱动),当一个事件发生时,系统会产生一条特定的消息,以标识该事件的发生. 消息: 传递信息或请求的

7、数据包.例如,在窗口客户区按下鼠标左键时,将产生一条WM_LBUTTONDOWN消息.该消息包含虚键是否按下、光标坐标等信息. 并非所有的消息都是由事件产生.有些消息是由系统发出的,有些消息是由函数调用产生的. WM_PAINT消息是由系统发出的. 调用PostQuitMessage()会产生一条WM_QUIT消息. Windows程序的设计重点是编写消息处理代码,事件驱动编程方法对于编写交互式程序很有用处,它避免了死板的操作模式,1.3 事件驱动,事件: 孩子挨爸爸打 消息: 孩子喊叫 消息处理: 妈妈收到消息后的某种反应,事件: 单击按钮 消息: BN_CLICKED 消息处理: 编码实现

8、在编辑框内显示“Hello World!”,事件驱动举例,1.4 句柄,句柄,顾名思义,指的是一个Windows对象的把柄。 Windows中的句柄都是32位的指针变量,用来指向某个Windows对象所占据的内存区。 句柄的使用,极大地方便了Windows管理其内存中的各种Windows对象。,常用句柄类型及其说明,1.5 消息,消息是描述事件发生的信息。 Windows应用程序通过消息进行信息交换。 在Windows中,消息用结构体MSG表示,其结构如下: Typedef struct tagMSG HWND hwnd; /窗口句柄UNIT message; /消息号。WPARAM wPar

9、am;/用于提供消息的附加消息。LPARAM lParam;/用于提供消息的附加消息。DWORD time;/指定消息送至队列的时间POINT pt; /指定消息发送时屏幕光标的位置 MSG;,消息队列和在应用程序中的轮询处理,VC+中存在几种系统定义的消息分类,不同的前缀符号经常用于识别消息的分类,如下表所示:,1.6 Windows应用程序的常用消息,1.鼠标消息,主要有: WM_LBUTTONDOWN:产生单击鼠标左键的消息。 WM_LBUTTONUP:放开鼠标左键时产生的消息。 2.键盘消息,主要有: WM_KEYDOWN:按下一个系统键时产生的消息。 WM_KEYUP:放开一个系统键

10、时产生的消息。 3.窗口消息,主要有: WM_CREATE:窗口创建时,由CreateWindows函数发出的消息。 WM_CLOSE:关闭窗口时产生的消息。 WM_QUIT:退出应用程序时,由PostQuitMessage函数发出消息。 ,2.Windows应用程序的组成与编程,典型的Windows程序结构 入口函数WinMain() 窗口函数WinProc() Windows应用程序的常用数据类型 API编程实例,2.1 典型的Windows程序结构,Windows应用程序的主体由以下两个函数完成: WinMain()函数负责建立窗口和建立消息循环。 WinProc()函数负责消息的处理。

11、,2.1 典型的Windows程序结构,2.2 入口函数WinMain(),WinMain()函数类似C语言中的Main函数,是Win32应用程序入口函数。 WinMain()函数主要完成创建主窗口,并产生和处理消息循环。,WinMain()函数,因为Windows是多任务系统,所以同一应用程序的多个窗口可能会同时存在。 Windows系统对每个窗口的执行称为一个实例,用一个实例句柄来唯一标识。 WinMain()函数与DOS程序的main()函数起同样的作用,有一点不同的是,WinMain()函数必须带有四个参数,它们是系统传递给它的。 WinMain()函数的原型如下: int WINAP

12、I WinMain( HINSTANCE hInstance, /当前实例句柄HINSTANCE hPrevInstance, /前一个实例句柄LPSTR lpCmdLine, /命令行字符int nCmdShow) /窗口显示方式,WinMain()函数,第一个参数hInstance,是标识该应用程序当前实例的句柄。 第二个参数是hPrevInstance,它是用来标识该应用程序的前一个实例的句柄。 第三个参数是lpCmdLine,是指向应用程序命令行参数字符串的指针。 最后一个参数是nCmdShow,是一个用来指定窗口显示方式的整数。这个整数值可以是SW_SHOW、SW_HIDE、SW_S

13、HOWMAXIMIZED、SW_SHOWMINIMIZED等。,WinMain()函数主要由2部分组成: 窗口初始化 消息循环,窗口初始化包括以下主要步骤:,定义窗口类: 通过给窗口类数据结构WINDCLASS赋值,设置窗口类的各种属性。如窗口边框、窗口标题栏文字、窗口大小和位置、鼠标、背景色等。 注册窗口类: Win系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类。窗口类必须先注册后使用。窗口类的注册由函数RegisterClass()实现。 创建窗口实例: 创建窗口类的实例由CreateWindows()函数实现。 窗口显示: 窗口类的显示是由ShowWindows()函数和Upd

14、ateWindows()函数实现的。 ShowWindows()函数:应用程序通过调用此函数在屏幕上显示窗口。 UpdateWindows()函数:显示窗口后,应用程序调用此函数更新并绘制用户区,并发出WM_PAINT消息。,消息循环,Windows为当前执行的每个Windows程序维护一个消息队列。 在发生输入事件之后,Windows将事件转换为一个消息并将消息放入程序的消息队列中。 程序通过执行一块称之为消息循环的程序代码从消息队列中取出消息。 以下是WinMain()函数中消息循环的代码: /消息循环以调用GetMessage()开始,它从消息队列中取出/一个消息 while (GetM

15、essage( ,WinMain()函数的大致结构,int WINAPI WinMain( ) /定义窗口类:WNDCLASS wndclass;wndclass.style=CS_HREDRAW|CS_VREDRAW; 十个字段wndclass.lpszClassName=”AAA”; /注册窗口类:RegisterClass( ,2.3 窗口函数WndProc(),窗口函数WndProc()就是Windows应用程序的消息处理程序。 窗口函数WndProc()定义了应用程序对接收到的不同消息的响应,包含了对各种可能接收到的消息的处理过程。 WndProc函数由一个或多个switch语句组成

16、。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。 窗口消息处理程序不予处理的所有消息被传给名为DefWindowProc的Windows函数进行默认处理。,消息处理函数WndProc的大致结构,LRESULT CALLBACK WndProc(HWND hMainwnd, UINT message, WPARAM wParam, LPARAM lParam) /窗口函数的定义 switch( message ) case WM_KEYDOWN:/击键消息 ;break; case : ;break;case WM_DESTROY:

17、/关闭应用程序窗口时发出的消息 PostQuitMessage(0);/发出WM_QUIT消息,结束应用程序return 0;default : break;/调用缺省消息处理过程return DefWindowProc(hMainwnd, message, wParam, lParam); ,2.4 Windows应用程序的常用数据类型,2.5 API编程实例,所有的Windows应用程序中,都有一个程序初始化的过程。 下面以一个实现最简单功能的程序WinApiDemo为例,说明Windows程序的基本框架。操作步骤如下: (1)打开Visual C+ .Net。 选择“文件”菜单的“新建”

18、,在出现的菜单中,选择“项目”,在弹出的窗口点取“空项目” 。 (2)在“位置”中填入工程的路径,然后在“名称”中填入“WinApiDemo”,其它按照缺省设置,单击OK按钮。 (3)在解决方案资源管理器,右键点击项目名称,在出现的 菜单上选择“添加”,再选择“新建项”。在弹出的窗口中,选择“C+文件”,表示新建一个C+源文件。点击“添加”。 (4)在“WinApiDemo.cpp”文件中输入以下程序代码。,抓图1:新建项目,抓图2:选空项目,输入位置和名称,抓图3:添加新建项,抓图4:添加新建项,WinApiDemo.cpp源代码(1),#include /头文件 LRESULT CALLB

19、ACK WndProc(HWND,UINT,WPARAM,LPARAM); /窗口函数声明,这一函数将处理发往应用程序窗口的各种消息char szClassName=“windowclass“;/窗口结构体的名称 char szAppTitle=“API建立窗口实例“;/窗口的标题int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam , int nCmdShow) /WinMain()函数的定义 HWND hMainWnd;/窗口句柄MSG msg;/消息结构体WNDCLASS w

20、inclass;/窗口结构体,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=Lo

21、adCursor(NULL,IDC_ARROW);/窗口光标winclass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); /窗口背景色为浅灰色winclass.lpszMenuName=NULL;/窗口菜单winclass.lpszClassName= LPCSTR(szClassName); /给窗口结构体命名,/CreateWindow()函数将根据窗口结构体的名称来建立窗口RegisterClass(/注册窗口,WinApiDemo.cpp源代码(3),/下面用CreateWindow()函数来建立窗口,并返回所建立窗口的句柄h

22、MainWnd=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);/显示最大化

23、窗口UpdateWindow(hMainWnd);/更新窗口/下面用While()循环来建立消息循环while(GetMessage( ,WinApiDemo.cpp源代码(4),LRESULT CALLBACK WndProc(HWND hMainwnd, UINT message, WPARAM wParam, LPARAM lParam) /窗口函数的定义 switch( message ) case WM_KEYDOWN:/击键消息 MessageBox(hMainwnd, LPCSTR(“键按下了!“), LPCSTR(“Keyboard“), MB_OK);break; case

24、WM_RBUTTONDOWN:/鼠标消息 MessageBox(hMainwnd, LPCSTR(“鼠标右键按下了!“), LPCSTR(“Mouse“), MB_OK);break;case WM_LBUTTONDOWN:/鼠标消息 MessageBox(hMainwnd, LPCSTR(“鼠标左键按下了!“), LPCSTR(“Mouse“), MB_OK);break;case WM_DESTROY:/关闭应用程序窗口时发出的消息 PostQuitMessage(0);/发出WM_QUIT消息,结束应用程序return 0;default : break;/调用缺省消息处理过程retur

25、n DefWindowProc(hMainwnd, message, wParam, lParam); ,WinApiDemo的运行画面,3.Windows MFC编程,为什么需要MFC MFC概述和发展历史 MFC的优势 MFC类结构以及一些基础类的介绍 MFC的使用 类向导的介绍和使用,3.1 为什么需要MFC(微软基础类库),利用Windows API开发程序的用户有这样的体会,即使开发一个简单的Windows应用程序也需要对Windows的编程原理有很深刻的认识,需要手工编写冗长的代码。由于程序的出错率是随着代码长度的增加呈几何级数增长的,而且当程序长度逐渐膨胀时,调试程序会变得越来越

26、困难。因此,传统的Windows应用程序设计需要程序员有极大的耐心和丰富的编程经验。微软在Visual C+捆绑了MFC基础类库,编程时我们就可以利用类的可重用性和可扩充性,大大降低Windows应用程序设计的难度和工作量。,3.2 MFC概述,类库是一个可以在应用程序中使用的相互关联的C+类的集合。 MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。 虽然程序在功能上千差万别,但从本质上看,都可以分为用户界面设计、文件操作、数据库访问及多媒体使用等几部分,这些都可以通过一些类来实现。MFC提供了一个标准化的程序结构,使开发人

27、员不必从头设计一个Windows应用程序。 MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。,MFC 的发展历史,MFC 9.0,VC+.NET 2008,3.3 采用MFC编程的优势,使用标准化的程序代码结构,有利于程序员之间的交流 Visual C+为MFC提供了大量的工具支持,提高了编程效率。如VC6.0利用MFC AppWizard创建MFC应用程序框架,利用ClassWizard方便地对Windows消息进行管理。VC+.Net 更为方便。 MFC应用程序的效率较高,只比传统的Windows C程序低5%左右。并且,在MFC应用程序中还允许混合使用传统

28、的Windows API函数。 其它优势:完全支持Windows所有的函数、控件、消息、菜单及对话框;具有良好的稳定性和可移植性,更符合微软的风格等。,MFC还很好地保持了程序的向下兼容性,是用来编写Windows应用程序的C+类集,提供了大量的基类供程序员根据不同的应用环境进行扩充,允许在编程过程中自定义和扩展应用程序中的类,较好的移植性,可移植于众多的平台,3.4 MFC类的组织结构,MFC库中的类按层次关系划分类: (1)根类:CObject (2)应用程序体系结构类 (3)窗口、对话框和控件类 (4)绘图和打印类 (5)简单数据类型类 (6)数组、列表和映射类 (7)文件和数据库类 (

29、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

30、类,是所有异常情况的基类。不能直接建立CException对象,只能建立派生类的对象,用派生类来捕获指定的异常情况,3模板收集类,这些类可以将多种对象存放到数组、列表和“ 映射”中。但这些收集类是模板,它们的参数确定了存放在集合中的对象类型。,回顾最基本的Socket,有了套接字工具,能做什么,建立通信设备之间的数字通道 网络探测工具,例如各类扫描器 网络攻击工具,例如各种漏洞攻击的toolkit,最近的项目,远程控制类型不确定的设备多通道抗DDOS攻击的通信技术,MFC的使用,MFC的使用-应用程序向导,68,70,71,72,73,77,MFC应用程序中的文件,1、用记事本打开这个sln文

31、件看. 写明了项目ID和目录 Project(“8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942“) = “MFCtest“, “MFCtestMFCtest.vcproj“, “928AB0F2-F873-4E18-91F0-71B08AB2F9E7“ EndProject,78,MFC应用程序中的文件,2、用记事本打开这个vcproj文件看.说明了debug 和 release 两种编译方式采取的编译设置 说明了头文件(*.h) 源程序(*.cpp)资源文件(*.rc *.ico),利用MFC来管理类,point.h,class CPoint private:int

32、 X;int Y; public:CPoint(int x=0,int y=0);void Show( );,#include “point.h” CPoint:CPoint(int x=0,int y=0)X=x; Y=y; void CPoint:Show( )cout“(”X“,”Y“)”; ,point.cpp,void f( );,void CPoint:f( ) /添加代码 ,MFC管理类的方式,类视图的使用,利用MFC应用程序向导生成应用程序框架后,需要为程序添加消息处理成员函数和成员变量,有时还需要为程序添加新的MFC派生类,那么这些可以通过类视图右键点击来实现。经典VC6.0

33、以MFC ClassWizard类向导来实现。现在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

34、_BN_CLICKED(IDCANCEL, &CMFCtestDlg:OnBnClickedCancel) END_MESSAGE_MAP()/对于 IDOK 这个按钮,接收到 BN_CLICKED 消息,就由 / CMFCtestDlg:OnBnClickedOk,增加一个消息处理函数(双击),MFC添加的源程序框架,.h文件,.cpp文件,消息映射区,BEGIN_MESSAGE_MAP(CMFCtestDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPON_BN_CLICKED(IDOK

35、, &CMFCtestDlg:OnBnClickedOk)ON_BN_CLICKED(IDCANCEL, &CMFCtestDlg:OnBnClickedCancel)ON_BN_DOUBLECLICKED(IDOK, &CMFCtestDlg:OnBnDoubleclickedOk) END_MESSAGE_MAP(),测试程序(在单击处理函数中),测试程序,鼠标事件和鼠标消息,添加其他消息处理,void CMFCtestDlg:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code heret

36、his-SetWindowTextW(_T(“Mouse is moving“);CView:OnMouseMove(nFlags, point); ,窗口事件和窗口消息,【EXAMPLE 】给一个窗口程序添加关闭和打开时的消息,使之能在打开和关闭时有小消息框提示。,在窗口设计界面点击右键,选属性,在属性窗口点击”消息”,作出选择,在生成的框架里面编写代码,问题:如何禁止窗口的关闭?,控制变量和控件,我们要实现的效果,点击,我们要实现的效果,程序实现的步骤,设计窗口,放置“change”按钮(ID 为 btnChange),和文本框控件(ID为edtText) 新建变量varText,关联文本框控件 创建按钮的单击事件,变更文本框的文本,设计窗体,添加文本框变量,添加文本框变量,双击,双击按钮添加默认消息处理函数,添加代码,进一步达到的效果,输入内容,进一步达到的效果,点击此按钮,进一步达到的效果,设计窗体,添加按钮。双击添加函数,添加代码,小结,MFC在编写常规程序比API快捷 MFC如何使用通过应用程序向导 类视图的使用 类创建 变量关联 处理消息的函数定义 数据在控件与变量之间传递,

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

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

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


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

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

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