[SNMP4J] [bug report & qestion]Q:how toDelete a row using SET PDU

wei tong thinkinrelativity at gmail.com
Thu Jul 2 03:41:48 CEST 2009


hi all,

first is one newbie question
and second a BUG report;

First a Question is how to delete a tabular data using a SET PDU?
it is googled that useing SET PDU to change the value to "invalid" will
effect,but i cant find what the "invalid" is.

Second i found something in DefaultUdpTransportMapping;

i wrote a testManager,here is some simple code about getting a scalar blow:

 public String getSnmpScalar(String oid) {
  this.listen();
  PDU response = null;
  try {

   response = sendScopedPDU(setGetPDU(oid, "GET"));
   if (response != null) {
    if (response.size() > 0) {
     VariableBinding vb = response.get(0);
     System.out.println(vb.getVariable().toString());
     this.close();
     return vb.getVariable().toString();
    } else {
     System.out.println("no response");
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  this.close();
  return null;
 }

 public void listen() {
  try {
   System.out.println(Thread.currentThread().getName()+"manager listen is
starting....");
   snmp.listen();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public void close() {
  try {
   System.out.println(Thread.currentThread().getName()+"manager listen is
closeing....");
   snmp.close();
   System.out.println("-------------------------------------------------------");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

in the main
public static void main{

  TestManager testManager = new TestManager();

  testManager.init();

 for (int i=0;i<100;i++){
  testManager.getSnmpScalar(SnmpNC.snmpBaseDefaultID);
  }


}

the console raised

-------------------------------------------------------
mainmanager listen is starting....
mainSend Message begin 1246496258471 millis
mainReceived response after 31 millis
11.36.221.1
mainmanager listen is closeing....
-------------------------------------------------------
mainmanager listen is starting....
mainSend Message begin 1246496258502 millis
Exception in thread "DefaultUDPTransportMapping_172.17.27.30/0"
java.lang.RuntimeException: java.net.SocketException: Socket is closed
 at org.snmp4j.transport.DefaultUdpTransportMapping.setSocketTimeout(Unknown
Source)
 at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(Unknown
Source)
 at java.lang.Thread.run(Unknown Source)
 at org.snmp4j.util.DefaultThreadFactory$WorkerThread.run(Unknown Source)
Caused by: java.net.SocketException: Socket is closed
                                    ~~~~~~~~~~~~~~~~~~~~~
 at java.net.DatagramSocket.setSoTimeout(Unknown Source)
 ... 4 more
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 org.snmp4j.Snmp.send(Unknown Source)mainmanager listen is closeing....

 at org.hfanms.snmp.TestManager.sendScopedPDU(TestManager.java:229)
 at org.hfanms.snmp.TestManager.getSnmpScalar(TestManager.java:254)
 at org.hfanms.snmp.TestManager.main(TestManager.java:736)
-------------------------------------------------------
mainmanager listen is starting....
mainSend Message begin 1246496258517 millis
mainmanager listen is closeing....
-------------------------------------------------------
mainmanager listen is starting....
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 org.snmp4j.Snmp.send(Unknown Source)
 at org.hfanms.snmp.TestManager.sendScopedPDU(TestManager.java:229)
 at org.hfanms.snmp.TestManager.getSnmpScalar(TestManager.java:254)
 at org.hfanms.snmp.TestManager.main(TestManager.java:738)
Exception in thread "DefaultUDPTransportMapping_172.17.27.30/0"
java.lang.NullPointerException
 at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(Unknown
Source)
 at java.lang.Thread.run(Unknown Source)
 at org.snmp4j.util.DefaultThreadFactory$WorkerThread.run(Unknown Source)
-------------------------------------------------------
i think the problem is caused by DefaultUdpTransportMapping thread and the
"listen" tread ;
in DefaultUdpTransportMapping.java

public synchronized void listen() throws IOException {
    if (listener != null) {
      throw new SocketException("Port already listening");
    }
    ensureSocket();
    listenerThread = new ListenThread();
    listener = SNMP4JSettings.getThreadFactory().createWorkerThread(
        "DefaultUDPTransportMapping_"+getAddress(), listenerThread, true);
    listener.run();
  }


in the "listen" thread
     run()
 synchronized (DefaultUdpTransportMapping.this) {
        listener = null;
        stop = true;
        if (socket != null) {
          socket.close();
        }
      }

i think it runs like blow:

TransportMapping.listen;
TransportMapping.listen;
        listen1.run;
        TransportMapping.close;
in the close section:
if (socketTimeout > 0) {
        try {
          l.join();
        }
        catch (InterruptedException ex) {
          interrupted = true;
          logger.warn(ex);
        }
      }
(socket closed here)
ERRORS shout here;

listen2.run;
listen1.stillrun;

TransportMapping1.close;
-------------------------------------------------------
heres 2 ways to avoid this:

  1. use thread.yield();
  for (int i=0;i<100;i++){
   testManager.getSnmpScalar(SnmpNC.snmpBaseDefaultID);
   thread.yield;
  }

  2. set a SocketTimeout when init a TransportMapping;
  DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
  //the defalut timeout is 0,i suggest to modify the value ?;
  transport.setSocketTimeout(1000);
  snmp = new Snmp(transport);
------------------------------------------------------
but i think it is real a bug,is it?


yours



More information about the SNMP4J mailing list