我正在端口161上编写一个snmp服务器,它只显示5颗星,我可以通过snmpget命令行获得星号,也可以通过snmpset设置它们。当我收到字符串形式的请求包时,我无法将其编码为可读。snmp数据包格式以整数开头表示版本,然后是八位字节字符串,依此类推...
public class MyServer {
public static void main(String[] args) throws Exception
{ DatagramSocket套接字=新的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‘公共?<\
发布于 2016-10-13 16:19:14
SNMP协议并不像其他协议那样简单。事实上,这是实现和使用的最复杂的协议之一。
构造SNMP消息需要对ASN.1指定的数据类型有一定的了解。ASN.1基元数据类型包括整数、八位字节(字节、字符)字符串、空值、布尔值和对象标识符。对象标识符类型是SNMP消息的核心,因为对象标识符类型的字段保存用于在SNMP代理中寻址参数的OID。为了扩展程序员组织数据的能力,ASN.1允许将原始数据类型组合到复杂数据类型中。
ASN.1提供了构建SNMP消息所需的几种复杂数据类型。序列是一种复杂的数据类型。序列只是一个数据字段的列表。序列中的每个字段可以具有不同的数据类型。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和其他一些。使用它们。
https://stackoverflow.com/questions/39933927
复制相似问题