【问题标题】:snmp server how to encode request packet?snmp 服务器如何编码请求数据包?
【发布时间】:2016-10-08 15:06:37
【问题描述】:

我正在端口 161 上编写一个 snmp 服务器,它只显示五颗星,我可以通过 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'公开?

【问题讨论】:

  • SNMP 数据包不是文本,所以你上面的代码 sn -p 是完全错误的。通过 IETF RFC 文档或 snmp4j 等开源库了解协议。

标签: sockets request snmp


【解决方案1】:

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

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

ASN.1 提供了构建 SNMP 消息所需的多种复杂数据类型。一种复杂的数据类型是序列。序列只是数据字段的列表。序列中的每个字段都可以有不同的数据类型。 ASN.1 还定义了 SNMP PDU(协议数据单元)数据类型,它们是特定于 SNMP 的复杂数据类型。 PDU 字段包含 SNMP 消息的正文。两种可用的 PDU 数据类型是 GetRequest 和 SetRequest,它们分别保存获取和设置参数所需的所有数据。归根结底,SNMP 消息是一个完全由 ASN.1 数据类型字段构建的结构。但是,仅指定正确的数据类型是不够的。如果 SNMP 消息是具有不同数据类型的字段序列,接收者如何知道一个字段在哪里结束,另一个字段从哪里开始,或者每个字段的数据类型?遵守基本编码规则 (BER) 可避免这些问题。 最基本的规则规定,每个字段都被编码为三个部分:类型、长度和值 (TLV)。类型使用单字节标识符指定字段的数据类型。 Length 指定后面 Value 部分的字节长度,Value 是实际传达的值(数字、字符串、OID 等)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2016-03-20
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多