SNMP4J服务端连接超时问题解决方案
我们的网络管理中心作为管理中心,是服务端!各个被管设备通过交换机作为客户端与网管中心进行通信,使用的TCP/IP协议!
SNMP只是一种协议包,SNMP4J作为SNMP使用的Java工具包,提供了方便安全的工具包功能!
但是在使用中发现一个问题就是,服务端与客户端发送消息时,发送数次后就不再发送数据了!网络抓包也抓不到,跟踪断点到SNMP4J的代码中发现了这样一个问题!
/** *SendsaSNMPmessagetothesuppliedaddress. * *@paramaddress *anTcpAddress
.A *ClassCastException
isthrownif *address
isnotaTcpAddress
*instance. *@parammessage *byte[]themessagetosent. *@throwsIOException */ publicvoidsendMessage(Addressaddress,byte[]message) throwsjava.io.IOException{ if(server==null){ listen(); } serverThread.sendMessage(address,message); }
我们可以看到,他与UDP的不同是,使用了一个服务的线程!
publicvoidsendMessage(Addressaddress,byte[]message) throwsjava.io.IOException{ Sockets=null; SocketEntryentry=(SocketEntry)sockets.get(address); if(logger.isDebugEnabled()){ logger.debug("Lookingupconnectionfordestination'" +address+"'returned:"+entry); logger.debug(sockets.toString()); } if(entry!=null){ s=entry.getSocket(); } if((s==null)||(s.isClosed())||(!s.isConnected())){ if(logger.isDebugEnabled()){ logger.debug("Socketforaddress'"+address +"'isclosed,openingit..."); } pending.remove(entry); SocketChannelsc=null; try{ //Openthechannel,setittonon-blocking,initiate //connect sc=SocketChannel.open(); sc.configureBlocking(false); sc .connect(newInetSocketAddress( ((TcpAddress)address).getInetAddress(), ((TcpAddress)address).getPort())); s=sc.socket(); entry=newSocketEntry((TcpAddress)address,s); entry.addMessage(message); sockets.put(address,entry); synchronized(pending){ pending.add(entry); } selector.wakeup(); logger.debug("Tryingtoconnectto"+address); }catch(IOExceptioniox){ logger.error(iox); throwiox; } }else{ entry.addMessage(message); synchronized(pending){ pending.add(entry); } selector.wakeup(); } }
他从一个Map中去获得连接SocketEntry,然后得到连接对象Socket!
判断Socket是否有效,有效则直接发送,无效则创建连接后再发送!
然后我找到这样一段代码
privatesynchronizedvoidtimeoutSocket(SocketEntryentry){ if(connectionTimeout>0){ socketCleaner.schedule(newSocketTimeout(entry),connectionTimeout); } }
也就是说服务端会自己检查的连接并且去清除他!
我尝试设置connectionTimeout的值
privatevoidinit()throwsUnknownHostException,IOException{ threadPool=ThreadPool.create("Trap",2); dispatcher=newMultiThreadedMessageDispatcher(threadPool,newMessageDispatcherImpl()); //本地IP与监听端口 listenAddress=GenericAddress.parse(System.getProperty("snmp4j.listenAddress","tcp:192.168.9.69/5055")); DefaultTcpTransportMappingtransport; transport=newDefaultTcpTransportMapping((TcpAddress)listenAddress); transport.setConnectionTimeout(0); snmp=newSnmp(dispatcher,transport); snmp.getMessageDispatcher().addMessageProcessingModel(newMPv1()); snmp.getMessageDispatcher().addMessageProcessingModel(newMPv2c()); snmp.getMessageDispatcher().addMessageProcessingModel(newMPv3()); USMusm=newUSM(SecurityProtocols.getInstance(),newOctetString(MPv3.createLocalEngineID()),0); SecurityModels.getInstance().addSecurityModel(usm); snmp.listen(); }
增加一行代码设置DefaultTcpTransportMapping的超时时间是0!
然后就没有问题了!
虽然临时解决了问题,但是由于对SNMP4J不够深入了解,我怕问题恐怕不是这样的!
我在此也希望使用SNMP4J为工具,且作为服务端,在发送数据时有问题的解决方法!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。