`
sfeve
  • 浏览: 43664 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

SNMP管理端控制代理端小例子

    博客分类:
  • C++
阅读更多

一个周末一直在进一步研究项目的管理端和代理端通信问题,早上终于有了点眉目,做个笔记。

 

实验的是一个远程控制代理端关机的功能。

 

管理端是用Java搭的前台网站,所以使用SNMP4J包编写程序。代理端使用agent++和snmp++两个开发包。

 

管理端的代码如下:

 

public static void main(String[] args) {
	Snmp snmp;
	try {
		//设置TransportMapping
		TransportMapping transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
			
		//设置target
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString("public"));
		target.setAddress(GenericAddress.parse(("10.150.0.84/161"));
		target.setRetries(2);
		target.setTimeout(5000);
		target.setVersion(SnmpConstants.version1);
			
		//设置请求PDU
		PDU requestPDU = new PDU();		
		requestPDU.setType(PDU.SET);//设置PDU类型

		//设置Variable		 
		//Gauge32型 无符号长整型
		requestPDU.add(new VariableBinding(new OID("1.3.6.1.4.1.502.1.70"), new Gauge32(Integer.valueOf("1"))));
						
		//处理返回结果
		ResponseEvent respEvnt = snmp.send(requestPDU,target); //向Agent发送PDU,并接收Response	
   		PDU responsePDU = respEvnt.getResponse();//解析response	
	
      		if(responsePDU.getErrorIndex() == PDU.noError 
   			&& responsePDU.getErrorStatus() == PDU.noError) { 
			//如果接收包没有出错
   			String strResult = responsePDU.getVariableBindings().firstElement().toString();
   			int len = strResult.indexOf("=");
			strResult = strResult.substring(len+1, strResult.length()).trim();
			if(strResult.equals(value)){   //如果返回值与设置值相同,返回true,否则,返回false
				System.out.println("set操作成功!");
			}  else{
				System.out.println("set操作失败!oid值与设置值不同!");
			}  else{
				System.out.println("set操作失败,接收包有错误:"+responsePDU.getErrorStatusText());			
			}	
   	
			snmp.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}	

}

 

 代理端比较复杂,主要代码如下:

 

//Subagent_Main.h

#include "StdAfx.h"
#include <windows.h>
#include <agent_pp/agent++.h>
#include <agent_pp/mib.h>
#include <agent_pp/mib_context.h>

#include <agentx_pp/agentx_subagent.h>

#define GROUP_OID "1.3.6.1.4.1.502.1"   //定义oid组
#define SHUTDOWN_OID "1.3.6.1.4.1.502.1.70"    //定义关机操作的oid

class Subagent_Main : public MibGroup {
public:
	Subagent_Main(const NS_SNMP OctetStr&, SubAgentXMib*);
	~Subagent_Main();

};

class Subagent_Shutdown : public MibLeaf {
public:
	Subagent_Shutdown();
	virtual ~Subagent_Shutdown();
	virtual int set(const Vbx&);
};

 

 实现:

 

//Subagent_Main.cpp
#include "stdafx.h"
#include "Subagent_Main.h"

Subagent_Main::Subagent_Main(const NS_SNMP OctetStr&, SubAgentXMib*) 
	:MibGroup(GROUP_OID, "Subagent") {
	add(new Subagent_Shutdown());
}

Subagent_Main::~Subagent_Main() {

}

Subagent_Shutdown::Subagent_Shutdown()
	 : MibLeaf(SHUTDOWN_OID, READWRITE, new Gauge32()) {
	
}

Subagent_Shutdown::~Subagent_Shutdown() {
		
}

Subagent_Shutdown::set(const Vbx& vb) {
	int isShutdown;
	vb.get_value(isShutdown);

	if(isShutdown) {
		//以下关机代码只对Win2000及以上版本系统有效

		HANDLE hToken;
		TOKEN_PRIVILEGES tkp;
		
		if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) {
			AfxMessageBox("无法打开存取命令");
			return 1;
		}
		
		LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
		tkp.PrivilegeCount=1;
		tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
		AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
		
		if(GetLastError()!=ERROR_SUCCESS) {
			AfxMessageBox("无法关机");
			return 1;
		}
		
		if(!ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0)) {
			AfxMessageBox("无法关机");
			return 1;
		}
		
	}
	
	return 0;
}

 测试函数内容如下:

 

先定义处理的线程函数Subagent:

 

UINT Subagent(LPVOID pPar) {
	//AfxMessageBox("子代理线程启动");

	SubAgentXMib* mib = new SubAgentXMib();

	AgentXSlave* agentx = new AgentXSlave();
	
	AgentXRequestList* reqList = new AgentXRequestList(agentx);

	// register requestList for outgoing requests
	mib->set_request_list(reqList);
	
	mib->add(new Subagent_Main("", mib)); //初始化
	
	mib->init();
	
	Request* req;

	while (TRUE) {	
		req = reqList->receive(20000);
		
		if (req) {
			mib->process_request(req);
		} else {
			mib->ping_master();  	// ping the master
		}
	}
	
	//AfxMessageBox("子代理线程结束");

	delete mib;
	delete agentx;

	return 0;
}

 

 最后在main函数里加入到开启线程函数即可:

 

AfxBeginThread(Subagent, NULL);   //开启子代理线程监听

 运行时,需要代理端装有snmp服务,但不能开启(一直不明白原因)。代理端先开启MasterAgent,再启动我们所写的代理Subagent。这时候管理端即可发控制请求。一运行,代理端即关机。

 

PS:大致流程如此,中间有很多细节需要慢慢调试。比如snmp++,agent++源码的下载,dll文件的编译生成等等。

下面仅附上SNMP4J开发包。

分享到:
评论
1 楼 sunzixun 2010-11-20  
我放弃了 agent++,选用Net-Agent, 同样server端用snmp++ 多线程的api

效果比较好,不过发现两个问题

1 支持中文需要修改ans1源码
2 会把trap id 默认输出到debug

相关推荐

    snmp配置.docx

    在服务器端,SNMP服务作为SNMP代理运行,它响应SNMP管理站(如网络管理系统)的查询,提供网络设备的状态信息。 10. **SNMP工具**: 在Linux中,有多种SNMP工具可用于测试和管理SNMP服务,如`snmpwalk`(列出MIB...

    全国1月高等教育自学考试计算机网络管理试题.pdf

    全国1月高等教育自学考试计算机网络管理试题涉及到的知识点主要涵盖了计算机网络管理的基础概念、网络性能指标、网络安全、网络协议、管理信息库(MIB)、SNMP(简单网络管理协议)以及Windows服务器管理等方面。...

    TCP-IP详解卷一:协议

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    全国2009年10月自学考试计算机网络管理试题及答案.pdf

    TCP(传输控制协议)是端系统之间的常用协议,负责提供可靠的数据传输服务,如P40所示。其他选项如IP(互联网协议)、ARP(地址解析协议)和PPP(点对点协议)则服务于不同的网络层功能。 3. RMON2通过时间过滤器...

    计算机网络(共102张PPT).pptx

    * 网络管理体系结构大部分具有同样的基本结构和关系集,由端接站(即被管设备,如计算机和其他网络设备)上嵌入的代理软件来搜集网络的通信信息和网络设备的统计数据,并把它们存入管理信息库中。 * 代理(Agent)是...

    全国2007年1月高等教育自学考试计算机网络管理试题.pdf

    12. **SNMPv2组**:SNMPv2中的SNMP组与管理对象的控制有关,涉及到管理操作。 13. **SNMPv2的PDU**:GetBulkRequestPDU是为提高效率,用于一次性获取大量管理信息。 14. **网络管理工具**:ping用于检测网络联通性...

    TCP_IP详解卷1

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCP/IP详解卷 pdf格式

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part04

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part09

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part05

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part06

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part03

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCP/IP详解part_2

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part08

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part11

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part12

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part07

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCPIP详解卷[1].part10

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

    TCP_IP协议详解卷一

    第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 ...

Global site tag (gtag.js) - Google Analytics