我正在编写一个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*)
我唯一能想到的是,我没有正确地格式化、发送或收听,但是在倒了一遍留档和示例之后,我什么也想不出来。有人有什么建议吗?
我想出来了。我用来将十六进制字符串转换为字节[]的方法工作不太正常。我转而使用内置转换器“DatatypeConverter.parseHexBinary(str);”而且效果很好。
如果您将问题缩小到十六进制字符串到字节数组的转换,那么可以这样做:
将十六进制字符串转换为字节数组,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配置与应用程序配置一起读取,但在这中间发生了一些事情。类似于