Solution to SNMP4J server connection timeout problem

Solution to SNMP4J server connection timeout problem

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:
  • Solve the problem of MySQL server actively disconnecting when there is no operation timeout
  • Solution to the timeout of the mini program server requesting the WeChat server
  • Solution to the timeout problem of curl and soap request service in php
  • A brief discussion on service exceptions caused by asynchronous multithreading timeout in Java
  • Detailed explanation of how to configure timeout in Nginx server
  • The Win7 system log prompts that the name resolution timeout of the name "domain name" has expired after no configured DNS server responds.
  • Solution for ORA-12170 TNS: Connection timeout when connecting to Oracle remote server
  • Timeout when connecting to the server using FileZilla

<<:  The specific use and difference between attribute and property in Vue

>>:  The difference between delete, truncate, and drop and how to choose

Recommend

HTML iframe usage summary collection

Detailed Analysis of Iframe Usage <iframe frame...

Automatic failover of slave nodes in replication architecture in MySQL 8.0.23

I have been in contact with MGR for some time. Wi...

Mysql 5.6 adds a method to modify username and password

Log in to MySQL first shell> mysql --user=root...

Detailed explanation of Linux index node inode

1. Introduction to inode To understand inode, we ...

JS implements array filtering from simple to multi-condition filtering

Table of contents Single condition single data fi...

HTML table tag tutorial (24): horizontal alignment attribute of the row ALIGN

In the horizontal direction, you can set the row ...

14 techniques for high-performance websites

Original : http://developer.yahoo.com/performance...

Real-time refresh of long connection on Vue+WebSocket page

Recently, the Vue project needs to refresh the da...

Analysis and solution of MySQL connection throwing Authentication Failed error

[Problem description] On the application side, th...

Summary of events that browsers can register

Html event list General Events: onClick HTML: Mous...

Web design and production test questions and reference answers

<br />Web Design and Production Test Part I ...

js implements table drag options

This article example shares the specific code of ...

Detailed explanation of JDBC database link and related method encapsulation

Detailed explanation of JDBC database link and re...