[SNMP4J] SNMP.close() not working for UdpTransport

Adam Brons abrons at us.ibm.com
Wed Aug 15 21:09:20 CEST 2007


Frank,

Thanks for the quick response.  Since my last email I did a bit more 
digging.  I've noticed that if I only use one protocol that I do not have 
a problem using Snmp.close() regardless of protocol. 
I'm kinda learning towards this being a problem with the fact that the UDP 
and TCP addresses are both 0.0.0.0/162.  I've looked at the source for 
addNotificationListener and the inner class NotificationDispatcher.  I 
believe what might be happening is that transport for UDP is overwritten 
by the TCP transport since the key is the ListenAddress.

As for my design, the purpose is to allow a user to shutdown the listening 
for SNMP messages.  As it stands in my last email.  A user would disable 
the SNMP Listener, but the process was still bound to the port until the 
application was closed.  This application is one such that it wouldn't not 
close regularly.  So if a user needed to disable the SNMP conduit this was 
not working.  I mentioned restarting because the user was not able to 
re-enable the SNMP listening until the application was completely closed 
and opened again.

Adam Brons
TSOM Software Engineer
IBM Tivoli Software



Frank Fock <fock at agentpp.com> 
08/15/07 02:17 PM

To
Adam Brons/Atlanta/IBM at IBMUS
cc
snmp4j at agentpp.org
Subject
Re: [SNMP4J] SNMP.close() not working for UdpTransport






Hi Adam,

You need to extend DefaultUDPTransportMapping to
set the socket option "setReuseAddress(true);"
before calling Snmp.listen(). Alternatively,
you can (should) change your design to avoid
repetitive socket creation.

Best regards,
Frank

Adam Brons wrote:
> I'm wondering if anyone has had a problem with releasing UPD resources 
> when calling a Snmp.close().
> 
> I'm attempting to listen to both UDP and TCP port 162 on IP 0.0.0.0. 
When 
> I call Snmp.close() the TCP resources are immediately returned, however 
> even after 65 seconds the UDP resources are still held.  Once the 
> application exists and the JVM stops, the resources are released. 
> Unfortunately, I need to be able to "restart" the listening on the TCP 
and 
> UDP ports via user intervention.  Also it should be noted that I'm 
created 
> a new Snmp object for each start.  I'm using version 1.8.1 of the SNMP4J 

> API.
> 
> Here are some code snippets:
> 
> Constructor: 
>         protected SNMPListener(SnmpConduitVariables variables, String 
> conduitType) throws UnknownHostException { 
>                 this.variables = variables;
>                 this.conduitType = conduitType;
> 
>                 if (variables != null && variables.getUsers() != null) {
>                         configSnmpUsers(variables.getUsers());
>                 }
> 
>                 // Create a thread pool to handle inbound SNMP events
>                 threadPool = ThreadPool.create("SNMPConduit", 
> DISPATHER_THREAD_NUMBER);
>                 mtDispatcher = 
>                         new MultiThreadedMessageDispatcher(threadPool, 
new 
> MessageDispatcherImpl());
> 
>                 // Add the SNMP versions we wish to monitor for
>                 mtDispatcher.addMessageProcessingModel(new MPv1());
>                 mtDispatcher.addMessageProcessingModel(new MPv2c());
>                 mtDispatcher.addMessageProcessingModel(new MPv3());
> 
>                 // Setup Authentication and Encryption protocols for 
> SNMPv3
>                 SecurityProtocols.getInstance().addDefaultProtocols();
> 
>                 /*
>                  * Builds the User Based Security Model up containing 
all 
> supported security
>                  * protocols, and setting a default engineID.
>                  * 
>                  * MPv3.createLocalEngineID might be something we allow 
> the user to specify as part of the 
>                  * Sensor or Conduit configuration.
>                  */
>             usm = new USM(SecurityProtocols.getInstance(),
>               new OctetString(MPv3.createLocalEngineID()), 0);
>             SecurityModels.getInstance().addSecurityModel(usm);
> 
> 
> Listen Method:
>         public synchronized void listen() throws IOException, 
> UnknownHostException {
>                 if (variables == null) {
>                         logger.error("No bind address or bind port were 
> specificed");
>                         throw new 
> UnknownHostException("SnmpConduitVariables is null therefore no bind 
> address and port can be determined");
>                 }
> 
>                 // Create Snmp4j Processor using our supplied 
> MessageProcessingModel
>                 snmp = new Snmp(mtDispatcher);
> 
>                 // Make a tcp and udp based address for listening
>                 UdpAddress udpAddr = new 
> UdpAddress(variables.getBindAddress() + "/" + variables.getBindPort());
>                 TcpAddress tcpAddr = new 
> TcpAddress(variables.getBindAddress() + "/" + variables.getBindPort());
>                 SNMPEventDispatcher dispatcher = new 
> SNMPEventDispatcher(variables, conduitType);
> 
>                 // Add transport mapping and command handler to Snmp 
> Engine
>                 if (snmp.addNotificationListener(udpAddr, dispatcher) &&
>                         snmp.addNotificationListener(tcpAddr, 
dispatcher)) 
> {
> 
>                         // Start listening
>                         snmp.listen();
>                         logger.info("SNMP Conduit Listening on 
> UDP:"+udpAddr.toString()+"...");
>                         logger.info("SNMP Conduit Listening on 
> TCP:"+tcpAddr.toString()+"...");
> 
>                         // Just wait for something to happen.
>                         try { 
>                                 synchronized (mutex) {
>                                         if (logger.isDebugEnabled()) 
> logger.debug("SnmpListener '"+variables.getBindAddress()+"' 
Waiting...");
>                                         mutex.wait();
>                                 }
>                         }
>                     catch (InterruptedException ex) {
>                         if (logger.isDebugEnabled()) {
>                                 logger.debug("SNMPConduit Caught 
> Interrupted Exception: ", ex);
>                         }
>                     } 
>                 } else {
>                         logger.error("Unable to bind using 
> address("+udpAddr.toString()+")");
>                         throw new IOException("Unable to bind using 
> address("+udpAddr.toString()+")");
>                 }
>         }
> 
> Close Method:
>         protected void close() {
>                 synchronized (mutex) {
>                         if (logger.isDebugEnabled()) 
> logger.debug("SnmpListener '"+variables.getBindAddress()+"' 
stopping...");
>                         mutex.notify();
>                         try {
>                                 snmp.close();
>                                 mutex.wait(65000);
>                                 if (logger.isDebugEnabled()) 
> logger.debug("SnmpListener: '"+variables.getBindAddress()+"' has 
closed");
>                         }
>                         catch(IOException ioe) {}
>                         catch(InterruptedException ie) {}
>                 }
>         }
> 
> Adam Brons
> TSOM Software Engineer
> IBM Tivoli Software
> _______________________________________________
> SNMP4J mailing list
> SNMP4J at agentpp.org
> http://lists.agentpp.org/mailman/listinfo/snmp4j

-- 
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com





More information about the SNMP4J mailing list