毕业设计(论文)-局域网监控系统.doc_第1页
毕业设计(论文)-局域网监控系统.doc_第2页
毕业设计(论文)-局域网监控系统.doc_第3页
毕业设计(论文)-局域网监控系统.doc_第4页
毕业设计(论文)-局域网监控系统.doc_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

中州大学信息工程学院中州大学信息工程学院 毕业设计(论文)毕业设计(论文) 2009 2010 学年第学年第 三三 学期学期 题目题目 局域网监控系统局域网监控系统 学生姓名(学号)学生姓名(学号) 指指导导教教师师 职职称称 副教授副教授 评阅评阅教教师师 职职称称 时时 间间 中州大学信息工程学院毕业设 计 (论文) 任务书 指导教师: 职称: 副教授 学生人数: 1 学生姓名、学号、专业): 毕业设计(论文)题目(来源、类型) 局域网监控系统(b、x) 毕业设计(论文)工作内容与基本要求(目标、任务、途径、方法、成果形式, 应掌握的原始资料(数据) 、参考资料(文献)以及设计技术要求、注意事项等) 为高效、便利的进行局域网监控,研制基于 udp 协议,该系统功能如下: 1注册、修改个人资料功能。 2对客户端数据进行选择性的过滤 3用户资料管理 4管理员权限管理 5. 用户桌面的信息 本系统采用 vc6.0+acess2000 进行开发。 希望能支持多方面问卷、有用户交流页面(论坛或留言板) 在研制中希望能体现 vc+ 的独特优点,也希望能在居于网的安全性上有 所研究 教研室审批意见: 审批人签名: 备注:(1)来源:a教师拟订;b学生建议;c企业和社会征集;d实习单位提 供 (2)类型:x真实课题;y模拟课题;z虚拟课题 中州大学信息工程学院设计 (论文) 开题报告 课题名称: 局域网监控系统 指导教师: 职称: 副教授 学生人数: 1 人 学生姓名(学号、专业):姓名: 专业:信息安全技术 开题报告内容: 设计的目的及意义:随着信息化的不断扩展,大部分企业都采用计算机 来管理自己的财务、商业机密等别的业务。但是并不是每个用计算机的员工, 都能在上班时间充分的利用计算机干自己的工作。即便是制定了相关的规章制 度还是不能约束其行为。那么局域网监控系统,完全可以起到约束的作用。该 系统可以实时的对局域网内的每台计算机进行屏幕监控。 设计的要求:(1)学会如何分割 udp 数据报;(2)学会发送和接受 udp 数据报;(3)学会自定义控件;(4)学会抓取屏幕(5)学会 ado 技术 对数据库操作 预期成果:(1)将客户端隐藏,并且不断向服务器端发送屏幕信息; (2)通过发送指令来控制客户端发来屏幕信息的位置;(3)通过 ado 技术实 现对 access 数据库操作 时间安排:9 月 20 号-10 月 15 号熟悉课题的基本要求,查阅相关的 资料,初步拟定设计的整体方案,完成开题报告 ;10 月 16 日-11 月 2 号将 监控系统的客户端完成,并对客户端进行试验总;11 月 2 日-11 月 13 号将 服务器端完成,对数据的操作进行总结,以及整个毕业设计的完成。 在王老师的指导下,综合我们以前所学的专业知识及查找的相关资料, 能够在预期的时间内完成整个网站和论文。 指导教师签名: 日期: 备注:(1)来源:a教师拟订;b学生建议;c企业和社会征集;d实习单位提 供 (2)类型:x真实课题;y模拟课题;z虚拟课题 摘摘 要要 internet 在我国刚刚起步时,上网人群主要是从事 it 技术的专业人员,年龄段多是中年人,但是随着 internet 技术的快速发展,我国的上网人群年龄逐年增 多,不仅包括中年人,青少年及老年人在上网人群的 比重不断增加。internet 上丰富的资源给人们带来了很 多的方便,但是也存在许多不良的信息危害青少年的 健康,一些家长担心青少年上网会影响其学习。局域 网监控系统能够将局域网中的某一台计算机的屏幕信 息发送到服务器端,家长可以随时了解青少年浏览的 网页信息,对青少年上网起到监督作用。 本文首先介绍了问题的背景,接着提出问题,并 针对具体项目展开需求调查分析;再基于需求设计出 具体的方案;然后对整个系统进行了详细的分析和设 计,在设计与实现过程中,结合源代码具体的描述出 整个项目的开发过程;最后对整个系统进行测试得出 测试结论。 关键字:屏幕监控;数据过滤 abstract the internet in china has just started, it is mainly engaged in the internet population technology professionals, the age is more middle-aged, but with the rapid development of internet technology, online population increased year by year, not only include age, teenagers and the elderly in middle-aged people increase the proportion of internet. abundant natural resources in the internet has brought people a lot of convenience, but there are also many bad information of health hazards, some parents teenagers about teenagers will affect the internet learning. lan monitoring system can be a computer network of the screen messages to the server, parents can understand teenagers web page for teenagers online information, play supervision. this paper firstly introduces the background, and then put forward questions, and in the light of specific project on demand survey analysis, based on the specific requirements to design the plan, then the whole system to carry on the detailed analysis and design, design and implementation process, combined with a specific description of the source of the development process of project, finally to the whole system test that test conclusions. keykey wordswords: monitormonitor screenscreen datadata filteringfiltering 第一章第一章 绪论绪论8 1.1 问题背景.8 1.2 研究范围及技术要求.8 1.2.1 研究范围8 1.2.2 技术要求8 第二章第二章 系统设计系统设计10 2.1 需求分析.10 2.2 系统目标.10 2.3 系统功能结构.10 2.3 系统预览.11 2.4 业务流程图.13 2.5 程序运行环境14 2.5 数据库设计14 第三章第三章 客户端设计客户端设计15 3.1 客户端模块概述15 3.2 客户端技术分析15 3.3 客户端实现过程16 第四章第四章 公共类设计公共类设计20 第五章第五章 系统登录模块设计系统登录模块设计20 5.1 系统登录模块概述20 5.2 系统登录模块技术分析21 5.3 系统登录模块实现过程21 第六章第六章 主窗体设计主窗体设计24 6.1 主窗体概述24 6.2 主窗体的实现过程24 第七章第七章 操作员管理模块设计操作员管理模块设计28 7.1 操作员模块概述28 7.2 操作员模块技术分析29 7.3 操作员模块实现过程29 第八章第八章 系统设置模块设计系统设置模块设计36 8.1 系统设置模块概述36 8.2 系统设置模块实现过程36 37 第九章第九章 开发技巧与难点分析开发技巧与难点分析37 9.1 及时关闭记录集37 9.2 访问带密码的 access 数据库38 9.3 防止 sql 注入攻击38 9.4on_command_range 宏的注意事项.39 9.5 收获与体会39 致谢致谢39 参考文献参考文献40 第一章第一章 绪论绪论 1.1 问题背景问题背景 internet 在我国刚刚起步时,上网人群主要是从事 it 技术的专业人员,年龄段多是中年人,但是随着 internet 技术的快速发展,我国的上网人群年龄逐年增 多,不仅包括中年人,青少年及老年人在上网人群的 比重不断增加。internet 上丰富的资源给人们带来了很 多的方便,但是也存在许多不良的信息危害青少年的 健康,一些家长担心青少年上网会影响其学习。局域 网监控系统能够将局域网中的某一台计算机的屏幕信 息发送到服务器端,家长可以随时了解青少年浏览的 网页信息,对青少年上网起到监督作用。 1.2 研究范围及技术要求研究范围及技术要求 1.2.1 研究范围研究范围 1. 设计该系统的功能模块划分,使用 acesss 2003 设计 出该系统的数据库。 2. 参考实际局域网监控系统,完成对系统的需求分析及 设计文档。 3.根据需求分析及设计文档完成代码编制。 1.2.2 技术要求技术要求 1. 功能模块划分合理。 2. 数据库设计满足功能要求。 3. 采用 udp 协议进行数据传输。 4. 对客户端的数据进行过滤。 5. 建立数据库访问接口类,实现对数据库的访问。 6. 实时抓取客户端的屏幕信息。 第二章第二章 系统设计系统设计 2.1 需求分析需求分析 局域网监控系统主要是对计算机屏幕信息进行实时监控。因此局域网监控系统需要实 现屏幕信息的时时发送和接受。由于屏幕信息需要时时显示,因此信息的传输速度要快, 屏幕信息要时时发送。为此,选择 udp 协议进行传输。为了防止服务器端随意的接收客户 端发来的数据报,服务器端需要对发来的数据报进行过滤,只有是制定的客户端才接收数 据。 2.2 系统目标系统目标 本系统属于小型的局域网监控系统,可以对某一台计算机进行屏幕监控。本系统主要 实现一下目标: 1.系统采用人机交互的方式,界面美观友好。 2.屏幕信息需要时时显示,网络延时不能大于 1 秒。 3.服务器端可以随时运行,只要客户端运行,就能够显示屏幕信息。 4.系统运行时占用内存不能大于 10mb,以免影响系统的性能。 5.客户端运行时需要隐藏显示窗口,其感觉不到在运行。 2.3 系统功能结构系统功能结构 局域网监控系统功能结构图如下所示。 局域网监控系统 客户端服务器端 主 窗 体 主 窗 体 系 统 登 录 操 作 员 管 理 系 统 设 置 2.3 系统预览系统预览 局域网监控系统分为客户端和服务器端两部分,其中客户端运行时将窗体隐身,服务 器端主要有四个窗体组成,分别为主窗体、操作员管理窗体、系统登录窗体、系统设置窗 体。其中,主窗体用于接收并显示屏幕信息。操作员管理窗体用于添加、修改、删除操作 员信息, 系统登录窗体用于系统在启动时验证用户身份。系统设置窗体用于设置客户端 ip。 主 窗 体 系统登录窗体 操作员管理窗体 系统设置窗体 2.4 业务流程图业务流程图 系系 统统 登登 录录 登录成功登录成功 是 主主 窗窗 体体 系统设置方向控制操作员管理 否 2.5 程序运行环境程序运行环境 本系统对运行环境有一定的要求,具体如下: 1、 系统开发平台:microsoft vc 6.0. 2、 系统开发语言:c+ 3、 数据库软件系统软件:microsoft acess 2003 4、 运行平台:windows xp 5、 分辨率:最佳效果 1024*1280 像素 2.5 数据库设计数据库设计 1、 数据库分析 在开发局域网监控系统时,使用数据库主要用于记录操作员信息及客户端信息,系统 设计的数据量比较小,因此本系统采用的 microsoft access2003 作为后台数据库,数 据库名字为 db_video,其中包含了 2 张表 2、 数据库概念设计 数据库概念设计是根据各个模块的需求“抽象”出数据实体的过程,也就是宏观 上用文字、图表描述数据表的过程。 为了增加系统的安全性,服务器端设置了登录窗口,在系统启动时弹出该窗口, 要求用户输入操作员名称和密码。其中用户的操作员名称和密码信息存储在数据表中。 这样在系统登录模块就需要一个操作员信息实体。 为了过滤服务器端接受的数据报,时期值接收制定客户端发来的数据,需要存储 客户端 ip,为此,需要单独设计一个客户端信息实体对象。 操作员信息表 操作员密 码 操作员姓 名 客户端信息表 客户端 ip 地址 第三章第三章 客户端设计客户端设计 3.1 客户端模块概述客户端模块概述 局域网监控系统分为客户端和服务器端两大模块,其中,客户端的主要作用是时时抓 取本机的屏幕信息,将其分成多个数据报,发送到服务器端。为了保证屏幕信息能够完整 的发送到服务器,客户端在发送一个数据报后,需要等待服务器端发来的确认信息,然后 继续发送下一个数据报。 3.2 客户端技术分析客户端技术分析 客户端要实现屏幕信息的发送,要解决两个关键问题:一是获取屏幕信息,将其转换为位 图格式;二是将位图信息发送到服务器。 一、将屏幕信息转换为位图格式 cdc* pdeskdc = getdesktopwindow()-getdc();/获取桌面画布对象 crect rc; getdesktopwindow()-getclientrect(rc);/获取屏幕的客户区域 int width = 300;/获取屏幕的宽度 int height = 300;/获取屏幕的高度 cdc memdc;/定义一个内存画布 memdc.createcompatibledc(pdeskdc);/创建一个兼容的画布 cbitmap bmp; bmp.createcompatiblebitmap(pdeskdc,width,height);/创建兼容位图 memdc.selectobject(/选中位图对象 bitmap bitmap; /定义位图信息 bmp.getbitmap( /获取位图信息 memdc.bitblt(0,0,width,height,pdeskdc,m_x,m_y,srccopy);/将屏幕信息输出到位 图 二、根据位图对象获取位图信息 一个位图文件通常有“位图文件头” 、 “位图信息头” 、 “调色板”和“实际位图数据” 4 个部分组成。其中“位图文件头” 包含 bmp 图像文件的类型、显示内容 、位图 标记、位图大小 等信息,在程序中使用 bitmapfileheader 结构来表示。 “位 图信息头”和“调色板”2 个部分描述了位图的宽度、高度、是否压缩、位图颜色 等信息,在程序中使用 bitmapinfo 结构描述。由于程序发送的位图不是以文件 形式发送的,只需要发送位图位图信息头、调色板和实际数据就可以了,因此不需 要位图文件头。 int panelsize = 0;/记录调色板大小 if (bitmap.bmbitspixelbmiheader.bibitcount = bitmap.bmbitspixel;/设置位图颜色用到的位数 pbinfo-bmiheader.biclrimportant = 0;/指定显示位图颜色的种类,如果值为 0,所有的颜色种类都需要 pbinfo-bmiheader.bicompression = 0;/指定位图的压缩类型 - “该语句 =0”说明改为图不进行压缩 pbinfo-bmiheader.biheight = height;/指定位图的高度 pbinfo-bmiheader.biplanes = bitmap.bmplanes;/为目标设备指定调 色板的数量,且该值只能是 1 pbinfo-bmiheader.bisize = sizeof(bitmapinfo);/设置 bitmapinfo 结构大小 pbinfo-bmiheader.bisizeimage = = bitmap.bmwidthbytes*bitmap.bmheight;/设置图像的大小 pbinfo-bmiheader.biwidth = width;/指定位图的宽度 pbinfo-bmiheader.bixpelspermeter = 0;/目标设备的水平分辨率 pbinfo-bmiheader.biypelspermeter = 0;/目标设备的垂直分辨率 m_x = m_recx; m_y = m_recy; 三、将位图信息发送到服务器 因为将图片信息传送到服务器端要求的实时性比较强,所以采用udp 协议将位 图信息发送到服务器 3.3 客户端实现过程客户端实现过程 1、 创建一个基于对话框的工程,名称为创建一个基于对话框的工程,名称为 client。 2、 在在 stafx.h 文件中引入套接字库。文件中引入套接字库。 3、 在应用程序类的在应用程序类的 instance 函数中初始化套接字函数中初始化套接字 wsadata data; wsastartup(2, 4、 改写应用程序类的虚方法改写应用程序类的虚方法 exitinstance int cclientapp:exitinstance() wsacleanup(); /清理套接字资源 return cwinapp:exitinstance(); 5、 在对话框类中添加如下成员变量在对话框类中添加如下成员变量 socket m_socket;/客户端套接字 cstring m_serverip;/服务器 ip int m_x,m_y;/抓起屏幕的起始坐标 word m_recx,m_recy;/收到服务器发来的抓起屏幕的起始坐标 bool m_confirm;/确认信息 int m_frameindex;/记录索引 int count;/每一个位图分报的数量 int bmpsize;/位图的实际大小 int mod;/记录余数 char *psendbuf;/发送缓冲区指针 char *head;/临时指针 sockaddr_in addrl;/套接字地址 bool m_received;/是否受到服务器发来的确认信息 int m_counter;/计数器 6、在对话框的初始化函数中,创建套接字将其绑定到指定位置,并初始化相应的成员变量在对话框的初始化函数中,创建套接字将其绑定到指定位置,并初始化相应的成员变量 bool cclientdlg:oninitdialog() hostent *phost=gethostbyname(“); char *localip=inet_ntoa(*(struct in_addr*)*phost-h_addr_list); sockaddr_in addr; addr.sin_family=af_inet; addr.sin_addr.s_un.s_addr=inet_addr(localip); addr.sin_port=htons(5001); m_socket=socket(af_inet,sock_dgram,0); if(m_socket=invalid_socket) messagebox(“套接字创建失败!“); if(bind(m_socket,(sockaddr*) m_serverip=““; getprivateprofilestring(“serverinfo“,“ip“,““,m_serverip.getbuffer(0),max_pat h,“./server.ini“);/读取 ini 配置文件 wsaasyncselect(m_socket,m_hwnd,cm_received,fd_read);/该函数的功能是在 套接字 m_socket 上,看是否有读取事件发生如果有,向窗口句柄为 m_hwnd 的窗口发送 cm_received 消息 m_x=m_y=0; m_recx=m_recy=0; m_confirm=true; psendbuf=new char1024*1024*2; head=psendbuf; onok(); m_received=false; m_counter=0; settimer(1,1000,null); return true; / return true unless you set the focus to a control 7、 自定义一个消息,当套接字接到数据时,将该消息发送到主窗口自定义一个消息,当套接字接到数据时,将该消息发送到主窗口 #define graphsize 1024 #define cm_received wm_user+200 /自定的消息 cm_received 8、 添加添加 onreceived()方法,该方法的作用是:接收服务器端发来的确认信息和控制信()方法,该方法的作用是:接收服务器端发来的确认信息和控制信 息息 void cclientdlg:onreceived() char *pdata=new char1024; memset(pdata,0,1024); sockaddr_in addr; int factsize=sizeof(sockaddr); int ret=recvfrom(m_socket,pdata,1024,0,(sockaddr*) if(ret!=-1) /判断是否接收成功 if(ret=4) /方向指令 m_recx=*(word*) /填充屏幕 x 坐标 m_recy=*(word*) /填充屏幕 y 坐标 if(ret=8) /确认指令 m_received=true; m_frameindex+=1; /将发送的数据报的序号加 1 if(m_frameindex5) m_counter=0; onok(); else /当接收到服务器发来的数据 m_received=false; m_counter=0; cdialog:ontimer(nidevent); 12、添加一个添加一个 onok 方法,将屏幕信息转化为位图信息,划分数据报的格式,计算每方法,将屏幕信息转化为位图信息,划分数据报的格式,计算每 个个 位图信息需要发送数据报的次数,调用位图信息需要发送数据报的次数,调用 senddata 方法。方法。 13、在对话框类中的在对话框类中的 onpaint 函数中添加函数中添加showwindow(sw_hide);将对话框隐将对话框隐 藏。藏。 第四章第四章 公共类设计公共类设计 在局域网监控系统的服务器端需要对数据库进行操作。为了方便管理,将有关数据库的 操作封装为一个类 cdatamanage。该类中包含 adoconnection 对象、adocommand 对象 和 adorecordset 对象,被提供 initdatabase 方法用于构造 ado 对象、连接数据库。 cdatamanage 类的具体实现过程如下: 1、 在 visual c+工程中的 stdafx.h 头文件中导入 msado15.dll 动态库。 #import “c:program filescommon filessystemadomsado15.dll“ no_namespacerename(“eof“,“adoeof“) 2、 创建一个普通类,命名为 cdatamanage,在该类中添加如下成员变量。 _connectionptr m_pconnection; _commandptr m_pcommand; _recordsetptr m_precord; 3、 向 cdatamanage 类中添加 initdatabase 方法构造 ado 对象,并连接数据库。 bool cdatamanage:initdatebase() hresult hr; try hr = m_pconnection.createinstance(“adodb.connection“);/创建 connection 对象 m_pcommand.createinstance(“adodb.command“); m_precord.createinstance(“adodb.recordset“); if(succeeded(hr) hr = m_pconnection-open(“provider=microsoft.jet.oledb.4.0;data source=db_video.mdb“,“,“,admodeunknown);/连接数据库 /上面一句中连接字串中的 provider 是针对 access2000 环境的,对于 access97,需 要改为:provider=microsoft.jet.oledb.3.51; catch(_com_error e)/捕捉异常 cstring errormessage; errormessage.format(“连接数据库失败!rn 错误信息:%s“,e.errormessage(); afxmessagebox(errormessage);/显示错误信息 return false; return true; 第五章第五章 系统登录模块设计系统登录模块设计 5.1 系统登录模块概述系统登录模块概述 为了防止非法用户使用系统,在局域网监控系统的服务器端提供了系统登录莫块。 在系统启动时,只有输入正确的用户名和密码才能进入主界面。 5.2 系统登录模块技术分析系统登录模块技术分析 为了验证用户输入的用户名和密码是否正确,需要根据用户输入的用户名和密码从数据 库中查询用户信息,如果有信息返回,表明用户名和密码正确;否则不正确。程序中使用 了 adocommand 对象执行查询操作。在使用 adocommand 对象时,首先需要设置 activeconnection 属性,该属性关联一个 adocommand 对象,然后设置 commandtext 属 性,该属性表示 adocommand 对象要执行的 sql 语句。如果 sql 语句中有参数,还需要 调用 parameters 属性的 append 方法插入参数,最后调用 adocommand 对象的 execute 方 法执行 sql 语句。代码如下: _parameterptr puser,ppassword; cserverapp *papp=(cserverapp*)afxgetapp(); puser=papp-m_datamanage.m_pcommand- createparameter(“user“,advarwchar,adparaminput, 100,(_bstr_t)user); ppassword=papp-m_datamanage.m_pcommand- createparameter(“password“,advarwchar,adparaminput, 100,(_bstr_t)password); papp-m_datamanage.m_pconnection-cursorlocation=aduseserver; papp-m_datamanage.m_pcommand-activeconnection=papp- m_datamanage.m_pconnection; papp-m_datamanage.m_pcommand-parameters-append(puser); papp-m_datamanage.m_pcommand-parameters-append(ppassword); /cstring sql=“select *from tb_userinfo where username=“+user+“ and password=“+password+“; papp-m_datamanage.m_pcommand-commandtext= “select *from tb_userinfo where username=user and password=password“;/ _recordsetptr precord=null; precord=papp-m_datamanage.m_pcommand-execute(0,null,adcmdtext); papp-m_datamanage.m_pcommand-parameters-delete(“user“); papp-m_datamanage.m_pcommand-parameters-delete(“password“); 5.3 系统登录模块实现过程系统登录模块实现过程 1、 创建一个对话框,如下图: 2、 修改对话框类的 pretranslatemessage 虚方法,当编辑框获得焦点时,按 enter 键控制焦 点移动。 bool clogindlg:pretranslatemessage(msg* pmsg) if (pmsg-message=wm_keydown /获取类名 getclassname(pmsg-hwnd,str.getbuffer(0),max_path); if (str=“edit“) pmsg-wparam = vk_tab ; return cdialog:pretranslatemessage(pmsg); 3、 处理“登录”按钮的单击事件,验证用户名和密码是否正确。如果用户名和密码正确, 关闭对话框并返回 idok。 void clogindlg:onlogin() / todo: add your control notification handler code here cstring user,password; m_username.getwindowtext(user); m_password.getwindowtext(password); if(user.isempty()|password.isempty() messagebox(“用户或密码不能为空!“); m_username.setfocus(); else _parameterptr puser,ppassword; cserverapp *papp=(cserverapp*)afxgetapp(); puser=papp-m_datamanage.m_pcommand- createparameter(“user“,advarwchar,adparaminput, 100,(_bstr_t)user); ppassword=papp-m_datamanage.m_pcommand- createparameter(“password“,advarwchar,adparaminput, 100,(_bstr_t)password); papp-m_datamanage.m_pconnection-cursorlocation=aduseserver; papp-m_datamanage.m_pcommand-activeconnection=papp- m_datamanage.m_pconnection; papp-m_datamanage.m_pcommand-parameters-append(puser); papp-m_datamanage.m_pcommand-parameters-append(ppassword); /cstring sql=“select *from tb_userinfo where username=“+user+“ and password=“+password+“; papp-m_datamanage.m_pcommand-commandtext= “select *from tb_userinfo where username=user and password=password“;/ 需要解释 _recordsetptr precord=null; precord=papp-m_datamanage.m_pcommand-execute(0,null,adcmdtext); papp-m_datamanage.m_pcommand-parameters-delete(“user“); papp-m_datamanage.m_pcommand-parameters-delete(“password“); if(precord!=null) try cstring str=(char*)(_bstr_t)precord-getfields()-getitem(“username“)- value; /messagebox(str); precord-close(); catch(.) messagebox(“用户名或密码不正确!“); /m_username.getfocus();出错的一个地方 m_username.setfocus(); precord -close(); return ; enddialog(idok); else messagebox(“用户名或密码不正确“); /m_username.getfocus();出错的一个地方 m_username.setfocus(); precord -close(); void clogindlg:oncancel() / todo: add extra cleanup here cdialog:oncancel(); 第六章第六章 主窗体设计主窗体设计 6.1 主窗体概述主窗体概述 局域网监控系统服务器端主窗体主要显示客户端发来的位图信息,并且控制客户端 抓图的起始坐标。 6.2 主窗体的实现过程主窗体的实现过程 1、 向对话框类中添加如下成员变量。 socket m_socket; char *m_bmpdata; char *m_tempdata; char *head; bool m_showbmp; int m_bmpsize; int m_recsize; cstring m_clientip; uint m_clientport; word m_lefttopx; word m_lefttopy; 2、 自定义一个消息,用于自套接字有数据时发送到主窗口中。 #define cm_received wm_user+1001 3、 想对话框中添加 showimage 方法,显示位图数据。 void cserverdlg:showimage() if(m_showbmp) bitmapinfo binfo; memcpy( int x=binfo.bmiheader.biwidth; int y=binfo.bmiheader.biheight; stretchdibits(m_bk.getdc()- m_hdc,0,0,x,y,0,0,x,y, 4、 向对话框中添加 onreceived 方法,用于接收客户端发来的数据。在数据接收后,向客 户端发送确认信息。 void cserverdlg:onreceived() char *buffer=new charmax_buff; sockaddr_in addr; int factsize=sizeof(addr); int ret=recvfrom(m_socket,buffer,1050,0,(sockaddr*) if(ret!=-1) cstring recip=inet_ntoa(addr.sin_addr); /messagebox(recip); if(recip!=m_clientip) /messagebox(m_clientip); delete buffer; return; m_clientport=ntohs(addr.sin_port); m_recsize+=ret; word orderid=*(word*) word endid=*(word*) int bmpsize=*(int *) m_lefttopx=*(word*) m_lefttopy=*(word*) sockaddr_in addr1; addr1.sin_addr.s_un.s_addr=inet_addr(m_clientip.getbuffer(0); addr1.sin_port=htons(m_clientport); addr1.sin_family=af_inet; int size=sizeof(addr1); char *pdata=“confirm“; sendto(m_socket,pdata,8,0,(sockaddr*) if(orderid=0) m_bmpsize=bmpsize; m_bmpdata=head; else m_bmpsize+=bmpsize; memcpy(m_bmpdata, m_bmpdata+=bmpsize; m_showbmp=false; if(endid=1) m_showbmp=true; m_bmpdata=head; memcpy(m_tempdata,head,1024*1024); showimage(); delete buffer; 5、 在对话框的消息映射部分手动添加一个消息映射,用于将 cm_received 与 onreceived 方法联系起来。如下: on_message(cm_received,onreceived) 6、 向对话框中添加 onbuttondown 方法,用于向客户端发送控制指令。 void cserverdlg:onbuttondown(uint nid) if(!m_clientip.isempty() word x=m_lefttopx; word y=m_lefttopy; char buffer4; sockaddr_in addr; addr.sin_family=af_inet; addr.sin_port=htons(m_clientport); addr.sin_addr.s_un.s_addr=inet_addr(m_clientip.getbuffer(0); int size=sizeof(addr); switch(nid) case idc_btdown: y=m_lefttopy+100; *(word*) *(word*) int ret=sendto(m_socket,buffer,4,0,(sockaddr*) break; case idc_btup: y=m_lefttopy-100; *(word*) *(word*) int ret=sendto(m_socket,buffer,4,0,(sockaddr*) break; case idc_btleft: x=m_lefttopx-100; *(word*) *(word*) int ret=sendto(m_socket,buffer,4,0,

温馨提示

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

评论

0/150

提交评论