当前位置: 首页 > 知识库问答 >
问题:

UDP snmp客户端Java存在问题

严誉
2023-03-14

我正在编写一个snmp客户端,它通过UDP端口161连接到网络服务器。它将发送ASN格式的消息并接收来自服务器的响应。我已经尝试了我能想到的一切,但我似乎无法让它正常工作。

程序应该接收并解析cmd中以下命令返回的计数器字段:

snmpget-d-v 2c-c公共129.130.10.43ip.ipInReceives.0

//命令结果:

{

向UDP发送43字节:[129.130.10.43]:161-

0000:30 29 02 01 04 06 70 75 62 6C 69 63 A0 1C 02 0)。。。。。平民的

0016:04 28 6A DF 1F 02 01 00 02 01 00 30 0E 30 0C 06。(j………0.0。。

0032:08 2B 06 01 02 01 04 03 00 05 00。。。。。。。。。

从UDP接收到47个字节:[129.130.10.43]:161-

0000:30 2D 02 01 04 06 70 75 62 6C 69 63 A2 20 02 0-。。。。。平民的

0016:04 28 6A DF 1F 02 01 00 02 00 30 12 30 10 06。(j………0.0。。

0032:08 2B 06 01 02 01 04 03 00 41 04 1B 49 0C 95。。。。。。。A.我

IP-MIB::ipInReceives。0=计数器32:457772181

}

//我的asn邮件格式注释:

要保存在字节[]数组中并传递到udp服务器的十六进制值:

30 29 02 01 04 06 70 75 62 6C 69 63 A0 1C 02

04 XX XX XX XX 02 01 00 02 01 00 30 0E 30 0C 06

08 2B 06 01 02 01 04 03 00 05 00

XX表示每个请求的请求ID XX将被更改(可能是随机的),以便创建唯一的请求ID

代码:

  public static void snmpMessage() throws SocketException
{
    DatagramSocket socket = null;
    byte[] serverResponse = new byte[1024];
    InetAddress addy = null;        
    byte[] hex = hexStringToByteArray("302902010004067075626C6963A01C0204121533EA020100020100300E300C06082B060102010403000500"); //note: this hex string is the exact string from the example program, so I know the string is correct
    addy = InetAddress.getByName("129.130.10.48"); //server IP address
    socket= new DatagramSocket();

    //method that creates unique snmp asn message replacing the XX's with appropriate non-negative hex values       
    hex = messageGenerator();

    //Data reproduction from byte[] array
    System.out.println("byte array integer format:\n" + Arrays.toString(hex)); //correctly prints out integer values        
    System.out.println("\nbyte array length: " + hex.length); //Correctly prints length of sending array (43)
    System.out.println("\nserver name: " + addy.getCanonicalHostName()); //correctly prints server name        
    String hex2 = toHex(hex);        
    System.out.println("\nbyte array in hex format: \n" + hex2); //correctly reproduces original hex string from byte[] array

    //at this point, I can only assume that my data is stored correctly
    //send byte array to server
    DatagramPacket sendPacket = new DatagramPacket(hex, hex.length, addy, 161);
        socket.send(sendPacket);                

    //get server's response
    DatagramPacket receivePacket = new DatagramPacket(serverResponse, serverResponse.length);       
        System.out.println("\nWaiting for server response...\n"); //prints out
        socket.receive(receivePacket);
        System.out.println("Response received"); //does not print
}

我的教授发布了一个示例,他只需将指针传递给char字符串:sendto(ockfd,(char*)s,43,0,(struct ockaddr*)

我唯一能想到的是,我没有正确地格式化、发送或收听,但是在倒了一遍留档和示例之后,我什么也想不出来。有人有什么建议吗?

共有2个答案

陈松
2023-03-14

我想出来了。我用来将十六进制字符串转换为字节[]的方法工作不太正常。我转而使用内置转换器“DatatypeConverter.parseHexBinary(str);”而且效果很好。

朱高超
2023-03-14

如果您将问题缩小到十六进制字符串到字节数组的转换,那么可以这样做:

将十六进制字符串转换为字节数组,Java

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}
 类似资料:
  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我有一个运行在一个系统上的java服务器,它从数据库加载数据并缓存到java缓存。我有其他的C++客户端,它正在运行使用相同的Java配置。两者都在不同的PC上运行。我希望对java和C++客户机都使用一个公共缓存,也就是说,如果我使用java加载缓存,然后我希望通过C++客户机查询这个缓存数据。我只是尝试这样设置组播选项。 如果两个客户机都在同一个系统上工作,它的工作是好的。但是当两者都在不同的

  • 客户端存储

  • 我正在尝试重建一个与elasticsearch 2.4对话的插件,以便与elasticsearch 5配合使用。 代码来自:https://github.com/pentaho/pentaho-kettle/blob/master/plugins/elasticsearch-bulk-insert/src/org/pentaho/di/trans/steps/elasticsearchbulk/E

  • 从Google云应用程序中,我需要打开位于项目云存储中的文件。我试图使用以下表单的URL访问该文件,但出现以下错误:http://storage.googleapis.com/my-bucket/my-file错误:访问被拒绝。匿名调用方没有存储对象 www.googleapis。com/上传/存储/v1/b/http://my_appl//my-bucket/my-file错误404 www.g

  • 我的基础结构很简单,我有一个git服务器、一个spring cloud config服务器和一个从config服务器和git获取配置的微服务。我从app-name获得这个配置文件: 和我的log4j2配置xml 问题是应用程序开始在syslog上进行日志记录,然后开始在控制台上进行日志记录,但停止在syslog上进行写入。因此,log4j配置与应用程序配置一起读取,但在这中间发生了一些事情。类似于