免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计任务书20092010学年第一学期专业: 计算机应用技术 学号: 070601197 姓名: 李俊蕾 课程设计名称: 计算机网络课程设计 设计题目: 编程简单实现snmp 完成期限:自 2009 年 12 月 7日至 2009 年 12 月 14 日共 1 周设计目的: snmp是简单网络管理协议,主要用来管理网络设备到目前为止几乎所有的网络产品都要为其提供支持,以方便管理员的管理和软件开发人员的开发。我们来研究有关snmp编程,以便更好的运用。 功能要求: 程序能够用snmp编程实验管理网络设备。 1、 设计的任务:熟悉snmp的基本理论,基于vc+6.0下,有关snmp编程的过程及api函数的用法。 2、 开发工具: c+ 语言 3、 进度安排:序号阶段内容所需时间1布置任务及调研2天2系统分析与设计2天3调试及报告撰写2天合 计6天4、 主要参考资料:1岑贤道. 网络管理协议及应用开发m.清华大学出版社.1998.2邢国光. 简单网络管理协议的理论与实践m.国防工业出版社.1999.3陈庆章. 网络原理与技术m.高等教育出版社. 20054晏国晟. 简单网络管理 m.清华大学出版社.20045 谭浩强. 程序设计(第二版)m.清华大学出版社,2000指导教师(签字): 教研室主任(签字): 批准日期: 年 月 日摘 要snmp(simple network management protocol,简单网络管理协议)的前身是简单网关监控协议(sgmp),用来对通信线路进行管理。随后,人们对sgmp进行了很大的修改,特别是加入了符合internet定义的smi和mib:体系结构,改进后的协议就是著名的snmp。snmp的目标是管理互联网internet上众多厂家生产的软硬件平台,因此snmp受internet标准网络管理框架的影响也很大。现在snmp已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。snmp的体系结构是围绕着以下四个概念和目标进行设计的:保持管理代理(agent)的软件成本尽可能低;最大限度地保持远程管理的功能,以便充分利用internet的网络资源;体系结构必须有扩充的余地;保持snmp的独立性,不依赖于具体的计算机、网关和网络传输协议。在最近的改进中,又加入了保证snmp体系本身安全性的目标。关键词: snmp;简单网络管理协议 课程设计说明书(论文)用纸目 录1 snmp的概述12 课程设计的主要内容及过程22.1加载snmp22.2 建立会话22.3 设置传输模式32.4 创建实体32.5 设置重传模式32.6 设置超时时间32.7 设置重传次数42.8创建上下文句炳42.9 创建变量捆绑列表42.10 追加绑定列表52.11 创建pdu63 接收消息并处理73.1 接收消息73.2 提取数据报73.3 计算返回列表数目83.4 取得返回结果84 程序代码8总 结11主要参考文献12第 13页 共 12页1 snmp的概述snmp开发于九十年代早期,其目的是简化大型网络中设备的管理和数据的获取。许多与网络有关的软件包,如hp的openview和nortel networks的optivity network management system,还有multi router traffic grapher(mrtg)之类的免费软件,都用snmp服务来简化网络的管理和维护。由于snmp的效果实在太好了,所以网络硬件厂商开始把snmp加入到它们制造的每一台设备。今天,各种网络设备上都可以看到默认启用的snmp服务,从交换机到路由器,从防火墙到网络打印机,无一例外。仅仅是分布广泛还不足以造成威胁,问题是许多厂商安装的snmp都采用了默认的通信字符串(例如密码),这些通信字符串是程序获取设备信息和修改配置必不可少的。采用默认通信字符串的好处是网络上的软件可以直接访问设备,无需经过复杂的配置。通信字符串主要包含两类命令:get命令,set命令。get命令从设备读取数据,这些数据通常是操作参数,例如连接状态、接口名称等。set命令允许设置设备的某些参数,这类功能一般有限制,例如关闭某个网络接口、修改路由器参数等功能。但很显然,get、set命令都可能被用于拒绝服务攻击(dos)和恶意修改网络参数。最常见的默认通信字符串是public(只读)和private(读/写),除此之外还有许多厂商私有的默认通信字符串。几乎所有运行snmp的网络设备上,都可以找到某种形式的默认通信字符串。snmp 2.0和snmp 1.0的安全机制比较脆弱,通信不加密,所有通信字符串和数据都以明文形式发送。攻击者一旦捕获了网络通信,就可以利用各种嗅探工具直接获取通信字符串,即使用户改变了通信字符串的默认值也无济于事。近几年才出现的snmp 3.0解决了一部分问题。为保护通信字符串,snmp 3.0使用des(data encryption standard)算法加密数据通信;另外,snmp 3.0还能够用md5和sha(secure hash algorithm)技术验证节点的标识符,从而防止攻击者冒充管理节点的身份操作网络1。虽然snmp 3.0出现已经有一段时间了,但目前还没有广泛应用。如果设备是2、3年前的产品,很可能根本不支持snmp 3.0;甚至有些较新的设备也只有snmp 2.0或snmp 1.0。即使设备已经支持snmp 3.0,许多厂商使用的还是标准的通信字符串,这些字符串对黑客组织来说根本不是秘密。因此,虽然snmp 3.0比以前的版本提供了更多的安全特性,如果配置不当,其实际效果仍旧有限。2 课程设计的主要内容及过程和其他编程过程一样,整个snmp编程也要经过一个创建,执行,销毁的过程,通俗点说就是要做准备,初始化snmp环境即加载snmp的功能,接着就要执行所进行的操作,snmp是基于消息机制的,所以消息传递与管理是我们在编程中所必须注意的问题,最后要进行销毁和回收资源2。2.1加载snmp用到的函数是snmpstartup(smilpuint32 nmajorversion,milpuint32 nminorversion,smilpuint32 nlevel,smilpuint32 ntranslatemode,smilpuint32 nretransmitmode);五个参数作为接收参数返回snmp的主版本号,副版本号,支持最高的操作标准,默认的实体/上下文传输模式,默认的重发机制。2.2 建立会话用到的函数是hsnmp_session snmpopen( hwnd hwnd, / handle to the notification windowuint wmsg / window notification message number);或hsnmp_session snmpcreatesession(hwnd hwnd, / handle to the notification windowuint wmsg, / window notification message numbersnmpapi_callback pfncallback, / notification callback functionlpvoid lpclientdata / pointer to callback function data);第二个函数并没有被完全确定下来,在编程过程中不是基于windows的编程提供一种选择,第一个参数指向接收消息的窗口句炳,第二个参数则指向该窗口需要接收的消息码。2.3 设置传输模式用到的函数是snmpapi_status snmpsettranslatemode(smiuint32 ntranslatemode / new entity/context translation mode);该函数只有一个参数,有以下几种选择:snmpapi_translated 不常用snmpapi_untranslated_v1 版本v1snmpapi_untranslated_v2 版本v2 2.4 创建实体用到的函数是hsnmp_entity snmpstrtoentity(hsnmp_session session, / handle to the winsnmp sessionlpcstr string / pointer to a string that identifies/ the entit);该函数的第一个参数是第二步返回的会话句炳,第二个参数与在第三步中设置的传输模式有关,如果选后两个参数,那么这里的string就是你要发送消息的网络设备ip地址或接收消息的管理设备ip地址。该函数返回一个实体句炳。2.5 设置重传模式用到的函数是snmpapi_status snmpsetretransmitmode(smiuint32 nretransmitmode / new retransmission mode); 该函数只有一个参数,有以下两种选择:snmpapi_on 启动重传模式snmpapi_off 关闭重传模式2.6 设置超时时间用到的函数是snmpapi_status snmpsettimeout(hsnmp_entity hentity, / destination management entitysmitimeticks npolicytimeout / new time-out value for database);该函数的第一个参数是第四步返回的实体句炳,通常我们设置目标实体的超时时间,也就是接收消息的网络设备的实体。第二个参数是超时的时间。2.7 设置重传次数用到的函数是snmpapi_status snmpsetretry(hsnmp_entity hentity, / destination management entitysmiuint32 npolicyretry / new retry count value for database);该函数的第一个参数是第四步返回的实体句炳,通常我们设置目标实体的重传次数,也就是接收消息的网络设备的实体。第二个参数是重传次数。2.8创建上下文句炳用到的函数是hsnmp_context snmpstrtocontext(hsnmp_session session, / handle to the winsnmp sessionsmilpcoctets string / pointer to a string structure);该函数的第一个参数是第二步返回的会话句炳,第二个参数与你在第三步中设置的传输模式有关,如果你选则后两个参数,那么这里的string就是共同体名。该函数返回一个上下文句炳。2.9 创建变量捆绑列表用到的函数是hsnmp_vbl snmpcreatevbl(hsnmp_session session, / handle to the winsnmp sessionsmilpcoid name, / pointer to the variable namesmilpcvalue value / pointer to the value to associate / with the variable);由上述,该函数的第一个参数是第二步返回的会话句炳,而其他两个参数开始时就可以置为空了。该函数返回一个绑定列表句炳。2.10 追加绑定列表用到的函数是snmpapi_status snmpsetvb(hsnmp_vbl vbl, / handle to the variable bindings listsmiuint32 index, / position of the variable binding entry / in the listsmilpcoid name, / pointer to the variable name portion / of the entrysmilpcvalue value / pointer to the variable value portion / of the entry);可以看到这个函数的后两个参数与snmpcreatevbl相同,先看第一个结构,就是smilpcoid中的oid,他的意思是对象标志符,就是一个指向smioid的指针类型3。看看他的内部构造:typedef struct smiuint32 len; / number of array elementssmilpuint32 ptr; / pointer to an array of subidentifiers smioid, *smilpoid;由上面的推理,可以得出是一个指向smivalue的指针类型。让我们来看看smivalue结构。typedef struct / smivalue portion of varbindsmiuint32 syntax; / insert snmp_syntax_ union smiint snumber; / snmp_syntax_int / snmp_syntax_int32 smiuint32 unumber; / snmp_syntax_uint32 / snmp_syntax_cntr32 / snmp_syntax_gauge32 / snmp_syntax_timetickssmicntr64 hnumber; / snmp_syntax_cntr64 smioctets string; / snmp_syntax_octets / snmp_syntax_bits / snmp_syntax_opaque / snmp_syntax_ipaddr / snmp_syntax_nsapaddrsmioid oid; / snmp_syntax_oid smibyte empty; / snmp_syntax_null / snmp_syntax_nosuchobject / snmp_syntax_nosuchinstance / snmp_syntax_endofmibview value; / union smivalue, *smilpvalue;从整体上看,该结构有两个类型构成,一个是smiuint32 syntax; 另一个共同体类型。2.11 创建pdu将数据发送到目的地,必须其按照特定的格式来发送,用函数hsnmp_pdu snmpcreatepdu(hsnmp_session session, / handle to the winsnmp sessionsmiint pdu_type, / pdu typesmiint32 request_id, / pdu request identifiersmiint error_status, / valid only for snmp_pdu_getbulk requestssmiint error_index, / valid only for snmp_pdu_getbulk requestshsnmp_vbl varbindlist / handle to the variable bindings list);来完成该功能。用下面的函数snmpapi_status snmpsendmsg(hsnmp_session session, / handle to the winsnmp sessionhsnmp_entity srcentity, / handle to the source entithsnmp_entity dstentity, / handle to the target entityhsnmp_context context, / handle to the contexthsnmp_pdu pdu / handle to the pdu); 3 接收消息并处理3.1 接收消息用函数snmpapi_status snmprecvmsg(hsnmp_session session, / handle to the winsnmp sessionlphsnmp_entity srcentity, / handle to the source entitylphsnmp_entity dstentity, / handle to the target entitylphsnmp_context context, / handle to the contextlphsnmp_pdu pdu / handle to the pdu);该函数的参数和snmpsendmsg好像是一样的,但参数的进出不一样,snmprecvmsg除第一个参数是创建过的以外,其他参数都是输出参数,就是用来接收的参数4。3.2 提取数据报用函数snmpapi_status snmpgetpdudata(hsnmp_pdu pdu, / handle to the pdusmilpint pdu_type, / pdu_type field of the pdusmilpint32 request_id, / request_id field of the pdusmilpint error_status, / error_status field of the pdusmilpint error_index, / error_index field of the pdulphsnmp_vbl varbindlist / handle to the variable bindings list);第一个参数是需要输入的,而这已经通过snmprecvmsg得到了,其他的参数都是需要接收的,request_id,如果用异步接收的话,可以帮你标识发送的消息。还有error_status和error_index,用在snmp_pdu_getbulk操作中,他们的意义是不同的,除此之外,他们用来接收snmp端返回的错误消息,如果返回全都是0,那就是正确返回了。3.3 计算返回列表数目用函数snmpapi_status snmpcountvbl(hsnmp_vbl vbl / handle to the variable bindings list);将上一步得到的varbindlist代入,他的返回只是一个整型,所得到的变量绑定列表返回的变量数。3.4 取得返回结果用函数snmpapi_status snmpgetvb(hsnmp_vbl vbl, / handle to the variable bindings listsmiuint32 index, / position of the variable binding entry / in the listsmilpoid name, / pointer to the structure to receive the / variable namesmilpvalue value / pointer to the structure to receive the / associated value);上一步已经得到了结果数,用一个简单的for循环一次将结果取出。该函数有四个参数,第一个在第三步已得到,第二个就是for循环中的变量值,记住取得变量是从0开始的,后两个参数与前面某个函数的参数有点相似。5前面把他们都置为空,现在snmp代理将返回值添了进去,定义两个变量,接收就行。对ip地址的接收会有点不同,返回值将其封装为一个指针数组了,需要一个一个的取出来!只有会话句炳是在发送和接收消息时都用到的,所以在发送和接收消息以后,要将其他四个句炳释放掉,应该在你应用程序退出的过程中释放掉,创建会话句炳的位置在构造函数里。以上这些释放句炳资源的函数snmp api都有提供,如snmpfreeentity,snmpfreecontext,snmpfreevbl,snmpfreepdu,snmpclose,他们的参数只有一个,就是要是放得句炳。4 程序代码#include#include#include#include#include#include#include#includewsnmputil.h/外部全局变量gvars,记录用户命令等信息globalvarsgvars;int main(intargc,char*argv)/初试化一般参数psnmp_mgr_sessionpsession=null;intnreturn=0;boolresult;inti=0;/初试化snmp参数smiuint32nmajorversion=0;smiuint32nminorversion=0;smiuint32nlevel=0;smiuint32ntranslatemode=0;smiuint32nretransmitmode=0;/加载snmp服务snmpstartup(&nmajorversion,&nminorversion,&nlevel,&ntranslatemode,&nretransmitmode);/分两种情况设置传输模式(snmp1/snmp2)if(gvars.version=false)snmpsettranslatemode(snmpapi_untranslated_v1);elsesnmpsettranslatemode(snmpapi_untranslated_v2);/为会话分配内存空间psession=(psnmp_mgr_session)snmputilmemalloc(sizeof(snmp_mgr_session)); createnotificationwindow(psession);/建立会话snmpopen(psession-hwnd,wm_snmp_incoming);/解析用户在命令行输入的命令switch(gvars.operation)casetrap:waitfortraps(psession);break;casewalk:createpdusendrequest(psess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医师承关系合同
- 建筑中包合同
- 抖音技术合同
- 2025年公共卫生专业《健康促进与慢性病管理》专项训练试题
- 超市转户合同
- 备战2026中考英语语法百题分类训练 专题20 一般过去时100题(中考真题+中考模拟)(原卷版)
- 续签合作合同
- 抚顺日租房合同
- 承建方和承包方安全合同
- 威马购车合同
- 国际高中入学测数学试卷
- 2025年甘肃省高考政治试题(含答案解析)
- 2025年湖南省初中生物学业水平考试(会考)真题详细解读及评析
- 视频号全套违禁词与违规行为规避指南
- 马尾综合征的护理查房
- 胎盘早剥护理病历讨论
- 铝液安全培训课件
- 混凝土基础拆除方案
- 注塑机的培训资料
- T/ZHCA 017-2022头发生长期与休止期数量比值测试方法
- 新人教版初中语文七年级上册课课练(全册)及答案
评论
0/150
提交评论