Hi Neeraj,

A trap is an unconfirmed PDU. Thus, it is send and the application/SNMP API 
will not wait for any response. 
In you case, the Java TCP layer accepted the message, but without the sleep 
statement, the TCP layer will not be able to actually send the message before 
you close the connection. 

Summarised it is not a bug in SNMP4J but a shortcoming in your code. Why are 
you using TCP for traps? UDP will be much better for this use case and you will 
not observe this issue with UDP.

Best regards,
Frank

> On 23. May 2017, at 20:33, Neeraj Vaidya <neeraj.vai...@yahoo.co.in> wrote:
> 
> Hi,
> I have written the following code to send v3 traps to a trap collector daemon 
> (specifically snmptrapd from net-snmp library), which is running on a TCP 
> port.
> The snmptrapd is running on a RHEL server. And my code is also running on 
> that same host.
> All I am trying at the moment is to include the linkup trapOID and the 
> sysUpTime in the PDU (ScopedPDU to be precise).
> 
> In an Eclipse IDE or even by invoking my application via a command line, when 
> I "Run" the application, traps do not get sent out, however, when I "Debug" 
> the application in Eclipse IDE, the traps DO get sent successfully.
> 
> Upon analyzing further, I noticed that when I "Run" the application, the 
> application completes (but without sending TRAPS) without any error, however, 
> the socket that got created as a result of the Snmp.send() invocation, is in 
> a SYN_RECV state. 
> 
> This lead me to think that it is possible that the ServerThread in the 
> DefaultTcpTransportMapping class is not allowed to complete the 3-way 
> handshake and thus the sending of the message, before the flow moves on to 
> the next statement in the code.
> 
> So, I then added a Thread.Sleep of even 10ms, immediately after the 
> Snmp.send() method invocation, and Now the trap gets sent out (both when I 
> "Run" the application via command-line/Eclipse OR even when I debug it in 
> Eclipse).
> 
> The code shown below is the one which contains the Thread.Sleep statement and 
> is a working version of the code.
> 
> Is this a bug in the SNMP4J library or am I doing something wrong in my code 
> ? Why does the trap not get sent out without adding the Sleep.
> Shouldn't the TCP connection (& send) be allowed to complete before the code 
> moves on to the next statement in the program ?
> 
> ------------------------------------------------ Code Start 
> ------------------------------------------------ 
> 
>                Address address = GenericAddress.parse("tcp:rhelhost1/1163");
> 
>               try {
>                       TransportMapping transportMapping = new 
> DefaultTcpTransportMapping();
>                       transportMapping.listen();                      
>                                       
>                       Snmp snmp = new Snmp(transportMapping);
> 
>                       USM usm = new USM(SecurityProtocols.getInstance(),
>                                                       new 
> OctetString(MPv3.createLocalEngineID()), 0);
>                       
>                       SecurityModels.getInstance().addSecurityModel(usm);
> 
>                       //snmp.listen(); ----> Do I need to use this invocation 
> ??
> 
>                       byte[] b = (new 
> BigInteger("0102030405",16)).toByteArray();
> 
>                       snmp.getUSM().addUser(new OctetString("snmp4j"),
>                                       new UsmUser(new OctetString("snmp4j"), 
> AuthMD5.ID, new OctetString("snmp4j"), PrivDES.ID, new 
> OctetString("snmp4j")));
>                       
>                       UserTarget target = new UserTarget();
>                               
>                       target.setAddress(address);
>                       target.setRetries(1);
>                       target.setTimeout(5000);
>                       target.setVersion(SnmpConstants.version3);
>                       target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
>                       target.setSecurityName(new OctetString("snmp4j"));
>                       
>                       // create the PDU
>                       ScopedPDU pdu = new ScopedPDU();
>                       long sysUpTime = Instant.now().getEpochSecond();
>                       //pdu.add(new 
> VariableBinding(SnmpConstants.sysUpTime),new OctetString(new 
> Date().toString()));
>                       pdu.setType(ScopedPDU.TRAP);                    
>                       pdu.add(new VariableBinding(SnmpConstants.sysUpTime, 
> new TimeTicks(sysUpTime)));
>                       pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, 
> SnmpConstants.linkUp));
>                       pdu.setContextEngineID(new 
> OctetString().fromByteArray(b));
>                       snmp.setLocalEngine(b, 0, 0);
>                       // send the PDU                 
>                       
>                       ResponseEvent response = null;
> 
>                       response = snmp.send(pdu, target);
> 
>                       Thread.sleep(10); // This Sleep somehow allows the 
> entire TCP 3-way handshake to occur without terminating the program 
> 
>                       snmp.close();                   
> 
>               } catch (IOException e) {
>                       e.printStackTrace();
>               } catch (InterruptedException e) {
>                       e.printStackTrace();
>               }       
> ------------------------------------------------ Code End  
> ------------------------------------------------ 
> 
> Regards,
> Neeraj
> _______________________________________________
> SNMP4J mailing list
> SNMP4J@agentpp.org
> https://oosnmp.net/mailman/listinfo/snmp4j

_______________________________________________
SNMP4J mailing list
SNMP4J@agentpp.org
https://oosnmp.net/mailman/listinfo/snmp4j

Reply via email to