[SNMP4J] Socket closed error in Windows 7
varma datla
varmakdatla at yahoo.com
Tue Aug 17 20:07:47 CEST 2010
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 <fock at agentpp.com>
To: varma datla <varmakdatla at yahoo.com>
Cc: "snmp4j at agentpp.org" <snmp4j at 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 <varmakdatla at 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 at agentpp.org
> http://lists.agentpp.org/mailman/listinfo/snmp4j
More information about the SNMP4J
mailing list