计算机网络编程简单实现SNMP论文

上传人:无*** 文档编号:79117240 上传时间:2022-04-23 格式:DOC 页数:15 大小:115.03KB
返回 下载 相关 举报
计算机网络编程简单实现SNMP论文_第1页
第1页 / 共15页
计算机网络编程简单实现SNMP论文_第2页
第2页 / 共15页
计算机网络编程简单实现SNMP论文_第3页
第3页 / 共15页
点击查看更多>>
资源描述
课程设计任务书20092010学年第一学期专业: 计算机应用技术 学号: 070601197 姓名: 李俊蕾 课程设计名称: 计算机网络课程设计 设计题目: 编程简单实现SNMP 完成期限:自 2009 年 12 月 7日至 2009 年 12 月 14 日共 1 周设计目的: SNMP是简单网络管理协议,主要用来管理网络设备到目前为止几乎所有的网络产品都要为其提供支持,以方便管理员的管理和软件开发人员的开发。我们来研究有关SNMP编程,以便更好的运用。 功能要求: 程序能够用SNMP编程实验管理网络设备。 一、 设计的任务:熟悉SNMP的基本理论,基于VC+6.0下,有关SNMP编程的过程及API函数的用法。 二、 开发工具: C+ 语言 三、 进度安排:序号阶段内容所需时间1布置任务及调研2天2系统分析与设计2天3调试及报告撰写2天合 计6天四、 主要参考资料: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第 12页 共 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(pSession,NULL);break;caseGET:caseGET_NEXT:result=CreatePduSendRequest(pSession,NULL);break;/创建一个PDU并发送一个请求caseGET_BULK:result=CreatePduSendRequest(pSession,NULL);break;caseSUB_TREE:result=CreatePduSendRequest(pSession,NULL);break;caseSET:result=CreatePduSendRequest(pSession,NULL);break;/先探测所给agent是否存在,之后再发送设定消息CloseWinSNMPSession(pSession);/关闭WinSNMP任务,调用了SnmpClose() SnmpUtilMemFree(pSession);/释放内存SnmpCleanup();/清理工作WSACleanup();/关闭Windowssocketsreturn(nReturn);/endofmain() 总 结通过这次计算机网络课程设计,使我巩固了这学期学习的知识,更加熟练地编写程序。虽然过程是艰辛的,设计过程中也经历了不少的困难,经过反复修改,不但从中学习了知识,又尝到了自己努力的喜悦。这次课程设计是老师给了范例程序,经过不断地改写,实现了要求。通过实际操作,学会 C语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。 在课程设计中我对计算机网络有很大的认识和了解。近几十年来,计算机的应用领域日益扩大,早已不再局限于简单的数值运算,而涉及到问题的分析。总之,通过这次的努力,编写出此程序,对已有知识有了更进一步的理解和认识,让我有了更好的实践,使我对计算机网络有了进一步的认识。希望在以后的学习中,能发挥自己的优势,在以后的学习中我会不断的完善自己、不断进取。这次的课程设计也使我意识到了理论与实践相结合的重要作用,学习到知识应该应用到实践中。主要参考文献1岑贤道. 网络管理协议及应用开发M.清华大学出版社.1998.2邢国光. 简单网络管理协议的理论与实践M.国防工业出版社.1999.3陈庆章. 网络原理与技术M.高等教育出版社. 20054晏国晟. 简单网络管理 M清华大学出版社.20045 谭浩强. 程序设计(第二版)M.清华大学出版社,2000
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


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

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


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