snmp服务器如何编码请求包?

时间:2016-10-08 15:06:37

标签: sockets request snmp

我正在端口161上写一个snmp服务器,它只显示五颗星,我可以通过snmpget命令行获取星号,也可以通过snmpset设置它们。当我收到字符串中的请求包时,我无法将其编码为可读。 snmp数据包格式以版本的整数开头,然后是八位字符串,依此类推......

public class MyServer {
    public static void main(String[] args) throws Exception

{ DatagramSocket socket = new DatagramSocket(161);

byte[] buffer = new byte[64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);

while(true)
{

socket.receive(packet);
byte[] data = packet.getData();


String s=new String(data,"UTF-8");
System.out.println(s+"\t"+packet.getAddress()+"\t"+packet.getPort());

输出有点像这样但是陌生人!!!

0'&公共LT; \

1 个答案:

答案 0 :(得分:0)

SNMP并不像其他协议那么简单。实际上,这是实现和使用最复杂的协议之一。

构建SNMP消息需要了解 ASN.1 指定的数据类型。 ASN.1原始数据类型包括Integer,Octet(字节,字符)String,Null,Boolean和Object Identifier。对象标识符类型是SNMP消息的核心,因为对象标识符类型的字段包含用于寻址SNMP代理中的参数的OID。为了扩展程序员组织数据的能力,ASN.1允许将原始数据类型组合成复杂的数据类型。

ASN.1提供了构建SNMP消息所需的几种复杂数据类型。一种复杂的数据类型是序列。 Sequence只是一个数据字段列表。序列中的每个字段可以具有不同的数据类型。 ASN.1还定义了SNMP PDU(协议数据单元)数据类型,这些数据类型是SNMP特有的复杂数据类型。 PDU字段包含SNMP消息的主体。可用的两种PDU数据类型是GetRequest和SetRequest,它们分别包含获取和设置参数所需的所有数据。最终,SNMP消息是完全由ASN.1数据类型的字段构建的结构。但是,指定正确的数据类型是不够的。如果SNMP消息是具有不同数据类型的字段序列,则接收方如何知道一个字段的结束位置和另一个字段的开始位置,或每个字段的数据类型?通过符合基本编码规则(BER)来避免这些问题。 最基本的规则规定每个字段分为三部分:类型,长度和值(TLV)。 Type使用单个字节标识符指定字段的数据类型。 Length指定以下Value部分的长度(以字节为单位),Value是传达的实际值(数字,字符串,OID等)。

所以请不要重新发明轮子,因为有几个写得很好的库完全按照标准实现SNMPv1,SNMPv2C和SNMPv3。这些是 NET-SNMP SNMP4J 以及其他一些。使用它们。