📄 agent.java
字号:
//agent.java
//*"*********************************************************************
// 这是一个实现部分SNMP协议的AGENT程序,它的功能是: *
// 1.从管理站接收UDP并解封装出SNMP消息; *
// 2.对收到的SNMP消息进行解码 *
// 3.根据请求对象,从MIB库中查询 *
// 4.生成GetResponse消息,并按照BER规则进行编码 *
// 5.把编码后的GetResponse消息封装在UDP中并发送到管理站 *
//......................................................................*
// Creted by: ZhuSiFeng(朱思峰) *
// Email him: ZhuSiFeng2003@yahoo.com.cn *
//*"***************************************************"*****************
import java.io.*;
import java.net.*;
//import java.lang.*;
public class agent
{
//*************************定义类的变量******************************************
static byte varBind[] = new byte[100]; //绑定变量表临时存储
static byte message[] = new byte [1024];//存储编码后的结果
//定义内置的MIB库,仅仅支持MIB-2下的system组
static byte sysDescrValueCode[] ={19,11,119,105,110,100,111,119,115,50,47,47,47};//windows2000
static byte sysObjectValueCode[] ={19,9,43,6,1,2,6,6,6,6,6};//1.3.6.1.2.6.6.6.6.6
static byte sysUptimeValueCode[] ={19,8,0,0,0,0,1,2,3,4};//15:30:28
static byte sysContactValueCode[] ={19,9,119,105,110,100,111,119,115,50,47};//MicroSoft
static byte sysNameValueCode[] ={19,5,119,105,110,100,111};//A-101
static byte sysLocationValueCode[] ={19,10,119,105,110,100,111,119,115,50,47,47};//publicLab
static byte sysServicesValueCode[] ={19,2,0,2};//TCP/IP
//功能:将byte数组message中所有元素打印出来(以16进制的形式)
static void printBytes(byte message[])
{
int chInt;
int msgLength=(int)message[1];
for(int i = 0;i<msgLength;i++)
{ chInt = (int)message[i];
if(message[i]<0){chInt += 256;}
char ch,ch1;
int temp1 = chInt/16;
int temp2 = chInt-temp1*16;
if( temp1 < 10 )
ch =(char)(temp1 + 48);
else
ch =(char) (temp1 + 55);
if( temp2 < 10 )
ch1 = (char)(temp2 + 48);
else
ch1 = (char)(temp2 + 55);
System.out.print(ch);
System.out.print(ch1);
System.out.print(" ");
}
}
//******************************定义主方法*********************************
public static void main(String args[]) throws Exception
{
System.out.println(" ***************************************************");
System.out.println(" *** 这是一个简单的SNMP代理端程序。 ***");
System.out.println(" *** 设计人员: 朱思峰 顾世哲 崔霞 ***");
System.out.println(" *** 联系方式: QQ:304854105 ZhuSiFeng@163.com ***");
System.out.println(" ***************************************************");
System.out.println("\n 正在启动SNMP代理程序 ...............................\n");
//生成一个DatagramSocke对象
DatagramSocket agentSocket = new DatagramSocket(161);
//管理站的IP地址和端口号port
InetAddress managerIPAddress = InetAddress.getByName(null);//缺省设置为同机器
int managerPort;
//对两个类进行实例化
EncodeSNMP myEncode= new EncodeSNMP();
DecodeSNMP myDecode= new DecodeSNMP();
//对收到的数据报进行计数
int Recvcounts=0;
try
{ while(true)
{
//从管理站接收一个UDP数据报
DatagramPacket receivePacket = new DatagramPacket(message, message.length);
agentSocket.receive(receivePacket);
managerIPAddress = receivePacket.getAddress();
managerPort = receivePacket.getPort();
//打印收到的数据报计数值
Recvcounts++;
System.out.println("\n\n--------------------------------------------------------------------------");
System.out.print(" 收到的数据报计数值(Recvcounts)= ");
System.out.println(Recvcounts);
//以十六进制打印收到的消息
System.out.println("\n 接收到的一个来自管理端的SNMP如下: ");
printBytes(message);
//对收到的消息进行解码
System.out.println("\n 系统正在对该消息进行解码........ ");
myDecode.Decode(message);
//生成GetResponse消息,并按照BER规则进行编码
System.out.println("\n 系统正在生成响应消息GetResponse........ ");
for(int i=0;i<10;i++)
varBind[i]=message[31+i];
int OIDNumber= (int)varBind[8];
switch(OIDNumber)
{
case 1:
for(int i=0;i<sysDescrValueCode.length;i++)
varBind[10+i]=sysDescrValueCode[i];
case 2:
for(int i=0;i<sysObjectValueCode.length;i++)
varBind[10+i]=sysObjectValueCode[i];
case 3:
for(int i=0;i<sysUptimeValueCode.length;i++)
varBind[10+i]=sysUptimeValueCode[i];
case 4:
for(int i=0;i<sysContactValueCode.length;i++)
varBind[10+i]=sysContactValueCode[i];
case 5:
for(int i=0;i<sysNameValueCode.length;i++)
varBind[10+i]=sysNameValueCode[i];
case 6:
for(int i=0;i<sysLocationValueCode.length;i++)
varBind[10+i]=sysLocationValueCode[i];
case 7:
for(int i=0;i<sysServicesValueCode.length;i++)
varBind[10+i]=sysServicesValueCode[i];
}
message=myEncode.GetResponse(varBind);
//把编码后的GetResponse消息封装在UDP数据报中发送到管理站
int messageLength =(int)(message[1]+2);
DatagramPacket sendPacket = new DatagramPacket(message, messageLength, managerIPAddress, managerPort);
agentSocket.send(sendPacket);
System.out.println("\n 系统已经把响应消息GetResponse发送到管理端! ");
} //end of while
} //end of try
catch(Exception e)
{System.out.println("There is a Exception.");}
finally
{agentSocket.close();
}
}//end of main()
}//end of class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -