SNMP4J服务端连接超时问题解决方案
我们的网络管理中心作为管理中心,是服务端!各个被管设备通过交换机作为客户端与网管中心进行通信,使用的TCP/IP协议!
SNMP只是一种协议包,SNMP4J作为SNMP使用的Java工具包,提供了方便安全的工具包功能!
但是在使用中发现一个问题就是,服务端与客户端发送消息时,发送数次后就不再发送数据了!网络抓包也抓不到,跟踪断点到SNMP4J的代码中发现了这样一个问题!
/** *SendsaSNMPmessagetothesuppliedaddress. * *@paramaddress *anTcpAddress.A *ClassCastExceptionisthrownif *addressisnotaTcpAddress*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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。