Our network management center serves as the management center and the server! Each managed device communicates with the network management center through the switch as a client, using the TCP/IP protocol! SNMP is just a protocol package. SNMP4J, as a Java toolkit used by SNMP, provides convenient and secure toolkit functions! However, a problem was found during use: when the server and the client send messages, they no longer send data after sending several times! The network packet capture was also unsuccessful, and a problem was discovered in the SNMP4J code after tracing the breakpoint! /** * Sends a SNMP message to the supplied address. * * @param address * an <code>TcpAddress</code>. A * <code>ClassCastException</code> is thrown if * <code>address</code> is not a <code>TcpAddress</code> * instance. * @param message * byte[] the message to be sent. * @throws IOException */ public void sendMessage(Address address, byte[] message) throws java.io.IOException { if (server == null) { listen(); } serverThread.sendMessage(address, message); } We can see that the difference between it and UDP is that it uses a service thread! public void sendMessage(Address address, byte[] message) throws java.io.IOException { Socket s = null; SocketEntry entry = (SocketEntry) sockets.get(address); if (logger.isDebugEnabled()) { logger.debug("Looking up connection for destination '" + address + "' returned: " + entry); logger.debug(sockets.toString()); } if (entry != null) { s = entry.getSocket(); } if ((s == null) || (s.isClosed()) || (!s.isConnected())) { if (logger.isDebugEnabled()) { logger.debug("Socket for address '" + address + "' is closed, opening it..."); } pending.remove(entry); SocketChannel sc = null; try { // Open the channel, set it to non-blocking, initiate // connect sc = SocketChannel.open(); sc.configureBlocking(false); sc .connect(new InetSocketAddress( ((TcpAddress) address).getInetAddress(), ((TcpAddress) address).getPort())); s = sc.socket(); entry = new SocketEntry((TcpAddress) address, s); entry.addMessage(message); sockets.put(address, entry); synchronized (pending) { pending.add(entry); } selector.wakeup(); logger.debug("Trying to connect to " + address); } catch (IOException iox) { logger.error(iox); throw iox; } } else { entry.addMessage(message); synchronized (pending) { pending.add(entry); } selector.wakeup(); } } He gets the connection SocketEntry from a Map, and then gets the connection object Socket! Determine whether the Socket is valid. If it is valid, send it directly. If it is invalid, create a connection before sending it! Then I found this code private synchronized void timeoutSocket(SocketEntry entry) { if (connectionTimeout > 0) { socketCleaner.schedule(new SocketTimeout(entry), connectionTimeout); } } That is to say, the server will check the connection itself and clear it! I tried setting the value of connectionTimeout private void init() throws UnknownHostException, IOException { threadPool = ThreadPool.create("Trap", 2); dispatcher = new MultiThreadedMessageDispatcher(threadPool,new MessageDispatcherImpl()); // Local IP and listening port listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "tcp:192.168.9.69/5055")); DefaultTcpTransportMapping transport; transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress); transport.setConnectionTimeout(0); snmp = new Snmp(dispatcher, transport); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3()); USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0); SecurityModels.getInstance().addSecurityModel(usm); snmp.listen(); } Add a line of code to set the timeout of DefaultTcpTransportMapping to 0! Then there will be no problem! Although the problem has been temporarily solved, due to my lack of in-depth understanding of SNMP4J, I am afraid that the problem may not be this! I also hope to use SNMP4J as a tool, and as a server, there is a solution to the problem when sending data! The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: The specific use and difference between attribute and property in Vue
>>: The difference between delete, truncate, and drop and how to choose
Detailed Analysis of Iframe Usage <iframe frame...
I have been in contact with MGR for some time. Wi...
Log in to MySQL first shell> mysql --user=root...
1. Introduction to KVM The abbreviation of kernel...
1. Introduction to inode To understand inode, we ...
Table of contents Single condition single data fi...
In the horizontal direction, you can set the row ...
Original : http://developer.yahoo.com/performance...
Recently, the Vue project needs to refresh the da...
[Problem description] On the application side, th...
Html event list General Events: onClick HTML: Mous...
<br />Web Design and Production Test Part I ...
Due to the limitation of CPU permissions, communi...
This article example shares the specific code of ...
Detailed explanation of JDBC database link and re...