Hello Frank, I apologize for that silly mistake and thanks for pointing it out. I've added a CountDownLatch so that the main() wouldn't exit unit all requests are being responded. Actually, we had this running in Tomcat..but just want to have a standalone program to reproduce the problem quicker. Please let me know if you want me to run any further tests on Windows 7.
Code: package com.some; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; import org.apache.log4j.Logger; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.TimeoutModel; import org.snmp4j.TransportMapping; import org.snmp4j.event.ResponseEvent; import org.snmp4j.event.ResponseListener; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.OID; import org.snmp4j.smi.UdpAddress; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; public class Snmp4JUtil { private static final Logger LOGGER = Logger.getLogger( Snmp4JUtil.class ); private Snmp snmp; private final int [] oid = {1, 3, 6, 1, 4, 1 }; private final ResponseListener listener; public Snmp4JUtil( final ResponseListener listener ) { this.listener = listener; try { final TransportMapping transport = new DefaultUdpTransportMapping(); this.snmp = new Snmp( transport ); snmp.setTimeoutModel( getTimeoutModel( new int[]{ 500, 1000 } ) ); snmp.listen(); } catch (IOException e) { LOGGER.error( "Snmp4JUtil() Error: " + e.getMessage() ); } } public void close() { try { snmp.close(); } catch (IOException e) { LOGGER.error( "close() Error: " + e.getMessage() ); } } public void send( final CommunityTarget target ) { PDU pdu = new PDU(); pdu.setType( PDU.GETNEXT ); pdu.add( new VariableBinding( new OID( oid ) ) ); try { this.snmp.send( pdu, target, null, listener); } catch (IOException e) { LOGGER.error( "send( CommunityTarget ) - address:" + target.getAddress() + "; error:" + e.getMessage() ); e.printStackTrace(); } } private TimeoutModel getTimeoutModel( final int[] timeoutsRetries ) { return new TimeoutModel() { public long getRequestTimeout( final int totalNumberOfRetries, final long targetTimeout ) { long requestTimeout = 0; for ( int i : timeoutsRetries ) { requestTimeout += i; } return requestTimeout; } public long getRetryTimeout( final int retryCount, final int totalNumberOfRetries, final long targetTimeout ) { return timeoutsRetries[retryCount]; } }; } public static void main( final String args[] ) throws Exception { final StringBuilder responses = new StringBuilder(); // A few thousand addresses...just for testing final Set<String> addresses = getAddresses( args[0] ); final CountDownLatch latch = new CountDownLatch( addresses.size() ); final ResponseListener listener = new ResponseListener() { public void onResponse( ResponseEvent event ) { //cancel event ((Snmp)event.getSource()).cancel(event.getRequest(), this); // output response here. responses.append( "Response: " + event.getResponse() ) .append( System.getProperty( "line.separator" ) ); latch.countDown(); System.out.println("countDown:" + latch.getCount()); } }; final Snmp4JUtil snmpUtil = new Snmp4JUtil( listener ); final Thread t = new Thread(){ public void run() { for ( final String ipAddress : addresses ) { final CommunityTarget target = new CommunityTarget(); target.setAddress( new UdpAddress( ipAddress + "/161" ) ); target.setVersion( SnmpConstants.version1 ); target.setRetries( 1 ); snmpUtil.send( target ); } System.out.println("Done requesting.."); // Wait for few more seconds for responses..just for testing. try { Thread.sleep( 10000 ); System.out.println( "Writing response to the file.." ); writeResponse( responses ); } catch ( Exception e ) { System.err.println( "Error while sleeping/writing: " + e.getMessage() ); } } }; t.start(); System.out.println("Started running the thread and waiting for countdown."); latch.await(); System.out.println("Finished waiting..closing snmp."); snmpUtil.close(); System.out.println( "Done." ); } private static void writeResponse( final StringBuilder sb ) throws Exception { final Writer output = new BufferedWriter(new FileWriter( "C:/responses.txt" )); try { output.write( sb.toString() ); } catch ( Exception e ) { System.err.println( "Error while writing responses: " + e.getMessage() ); } finally { output.close(); } } private static Set<String> getAddresses( final String fileName ) throws Exception { final Set<String> addresses = new LinkedHashSet<String>(); BufferedReader input = null; try { input = new BufferedReader(new FileReader( fileName ) ); String strLine; while ((strLine = input.readLine()) != null) { if ( strLine.trim().length() > 0 ) { addresses.add( strLine ); } } }catch ( Exception e ) { System.err.println( "Error while reading addresses: " + e.getMessage() ); } finally { if ( input != null ) { input.close(); } } return addresses; } } Thanks, Varma ________________________________ From: Frank Fock <f...@agentpp.com> To: varma datla <varmakda...@yahoo.com> Cc: "snmp4j@agentpp.org" <snmp4j@agentpp.org> Sent: Tue, August 17, 2010 1:00:01 PM Subject: Re: [SNMP4J] Socket closed error in Windows 7 Hi, There is an error in your program: main may return before the thread you started is finished. It is not related to SNMP4J other than the new release might be executed with a different speed on your system. Best regards, Frank Am 17.08.2010 um 18:30 schrieb varma datla <varmakda...@yahoo.com>: > Hello, > We are using snmp4j-1.9.3d asynchronously to find devices in a network. All is > working well until we tested it in Windows 7 where it is throwing the "Socket > is closed" exception after a few seconds and stops. Even the latest version > 1.11.1 didn't seemed to work. Luckily we had an older version, snmp4j-1.9.1e, > which is working just fine without any errors. > > Here are the details. Could you please suggest any ideas on why this is > happening on Windows 7? or if I'm not using snmp4j appropriately. > > > Environment: > OS- Windows 7 (Firewall is off) > SNMP4J- 1.9.3d ( also tested with 1.11.1) > JVM- 1.6.0_13 (also tested with 1.6.0_20) > Total addresses- 65025. > Exception:- > org.snmp4j.MessageException: Socket is closed > at org.snmp4j.MessageDispatcherImpl.sendPdu(Unknown Source) > at org.snmp4j.Snmp.sendMessage(Unknown Source) > at org.snmp4j.Snmp.send(Unknown Source) > at org.snmp4j.Snmp.send(Unknown Source) > at com.some.Snmp4JUtil.send(Snmp4JUtil.java:86) > at com.some.Snmp4JUtil$3.run(Snmp4JUtil.java:155) > > > Code: > package com.some; > > import java.io.BufferedReader; > import java.io.BufferedWriter; > import java.io.FileReader; > import java.io.FileWriter; > import java.io.IOException; > import java.io.Writer; > import java.util.LinkedHashSet; > import java.util.Set; > > import org.apache.log4j.Logger; > import org.snmp4j.CommunityTarget; > import org.snmp4j.PDU; > import org.snmp4j.Snmp; > import org.snmp4j.TimeoutModel; > import org.snmp4j.TransportMapping; > import org.snmp4j.event.ResponseEvent; > import org.snmp4j.event.ResponseListener; > import org.snmp4j.mp.SnmpConstants; > import org.snmp4j.smi.OID; > import org.snmp4j.smi.UdpAddress; > import org.snmp4j.smi.VariableBinding; > import org.snmp4j.transport.DefaultUdpTransportMapping; > > public class Snmp4JUtil > { > private static final Logger LOGGER = Logger.getLogger( Snmp4JUtil.class ); > > private Snmp snmp; > private final int [] oid = {1, 3, 6, 1, 4, 1 }; > private final ResponseListener listener; > > > public Snmp4JUtil( final ResponseListener listener ) > { > this.listener = listener; > > try > { > final TransportMapping transport = new DefaultUdpTransportMapping(); > this.snmp = new Snmp( transport ); > snmp.setTimeoutModel( getTimeoutModel( new int[]{ 500, 1000 } ) ); > snmp.listen(); > } > catch (IOException e) > { > LOGGER.error( "Snmp4JUtil(). Error: " + e.getMessage() ); > } > } > > public void close() > { > try > { > snmp.close(); > } > catch (IOException e) > { > LOGGER.error( "close(). Error: " + e.getMessage() ); > } > } > > public void send( final CommunityTarget target ) > { > > final PDU pdu = new PDU(); > pdu.setType( PDU.GETNEXT ); > pdu.add( new VariableBinding( new OID( oid ) ) ); > > try > { > this.snmp.send( pdu, target, null, listener); > } > catch (IOException e) > { > LOGGER.error( "send( CommunityTarget ) - address:" + > target.getAddress() + "; error:" + e.getMessage() ); > e.printStackTrace(); > } > } > > private TimeoutModel getTimeoutModel( final int[] timeoutsRetries ) > { > return new TimeoutModel() > { > public long getRequestTimeout( final int totalNumberOfRetries, > final long targetTimeout ) > { > long requestTimeout = 0; > > for ( int i : timeoutsRetries ) > { > requestTimeout += i; > } > > return requestTimeout; > } > > public long getRetryTimeout( final int retryCount, > final int totalNumberOfRetries, > final long targetTimeout ) > { > return timeoutsRetries[retryCount]; > } > }; > } > > public static void main( final String args[] ) > throws Exception > { > final StringBuilder responses = new StringBuilder(); > > final ResponseListener listener = new ResponseListener() > { > @Override > public void onResponse( ResponseEvent event ) > { > //cancel event > ((Snmp)event.getSource()).cancel(event.getRequest(), this); > > // output response here. > responses.append( "Response: " + event.getResponse() ) > .append( System.getProperty( "line.separator" ) ); > } > }; > > final Snmp4JUtil snmpUtil = new Snmp4JUtil( listener ); > > // A few thousand addresses...just for testing > final Set<String> addresses = getAddresses( args[0] ); > > final Thread t = new Thread(){ > public void run() > { > for ( final String ipAddress : addresses ) > { > final CommunityTarget target = new CommunityTarget(); > > target.setAddress( new UdpAddress( ipAddress + "/161" ) ); > target.setVersion( SnmpConstants.version1 ); > target.setRetries( 1 ); > > snmpUtil.send( target ); > } > > System.out.println("Done requesting.."); > > // Wait for few more seconds for responses..just for testing. > try > { > Thread.sleep( 10000 ); > > System.out.println( "Writing response to the file.." ); > writeResponse( responses ); > > snmpUtil.close(); > System.out.println( "Done." ); > } > catch ( Exception e ) > { > System.err.println( "Error while sleeping/writing: " + > e.getMessage() ); > } > } > }; > > t.start(); > } > > private static void writeResponse( final StringBuilder sb ) > throws Exception > { > final Writer output = new BufferedWriter(new FileWriter( > "C:/responses.txt" )); > > try > { > output.write( sb.toString() ); > } > catch ( Exception e ) > { > System.err.println( "Error while writing responses: " + e.getMessage() > ); > } > finally { > output.close(); > } > } > > private static Set<String> getAddresses( final String fileName ) > throws Exception > { > final Set<String> addresses = new LinkedHashSet<String>(); > BufferedReader input = null; > try > { > input = new BufferedReader(new FileReader( fileName ) ); > > String strLine; > while ((strLine = input.readLine()) != null) > { > if ( strLine.trim().length() > 0 ) > { > addresses.add( strLine ); > } > } > > }catch ( Exception e ) > { > System.err.println( "Error while reading addresses: " + e.getMessage() > ); > } > finally > { > if ( input != null ) > { > input.close(); > } > } > > return addresses; > } > } > > > Thank you and I appreciate your help. > > Varma > > > > _______________________________________________ > SNMP4J mailing list > SNMP4J@agentpp.org > http://lists.agentpp.org/mailman/listinfo/snmp4j _______________________________________________ SNMP4J mailing list SNMP4J@agentpp.org http://lists.agentpp.org/mailman/listinfo/snmp4j