SNMP4J服务端连接超时问题解决方案

我们的网络管理中心作为管理中心,是服务端!各个被管设备通过交换机作为客户端与网管中心进行通信,使用的TCP/IP协议!

SNMP只是一种协议包,SNMP4J作为SNMP使用的Java工具包,提供了方便安全的工具包功能!

但是在使用中发现一个问题就是,服务端与客户端发送消息时,发送数次后就不再发送数据了!网络抓包也抓不到,跟踪断点到SNMP4J的代码中发现了这样一个问题!

	/**
	 * Sends a SNMP message to the supplied address.
	 *
	 * @param address
	 *      an <code>TcpAddress</code>. A
	 *      <code>ClassCastException</code> is thrown if
	 *      <code>address</code> is not a <code>TcpAddress</code>
	 *      instance.
	 * @param message
	 *      byte[] the message to sent.
	 * @throws IOException
	 */
	public void sendMessage(Address address, byte[] message)
			throws java.io.IOException {
		if (server == null) {
			listen();
		}
		serverThread.sendMessage(address, message);
	}

我们可以看到,他与UDP的不同是,使用了一个服务的线程!

	public void sendMessage(Address address, byte[] message)
			throws java.io.IOException {
		Socket s = null;
		SocketEntry entry = (SocketEntry) sockets.get(address);
		if (logger.isDebugEnabled()) {
			logger.debug("Looking up connection for destination '"
					+ 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("Socket for address '" + address
						+ "' is closed, opening it...");
			}
			pending.remove(entry);
			SocketChannel sc = null;
			try {
				// Open the channel, set it to non-blocking, initiate
				// connect
				sc = SocketChannel.open();
				sc.configureBlocking(false);
				sc
						.connect(new InetSocketAddress(
								((TcpAddress) address).getInetAddress(),
								((TcpAddress) address).getPort()));
				s = sc.socket();
				entry = new SocketEntry((TcpAddress) address, s);
				entry.addMessage(message);
				sockets.put(address, entry);

				synchronized (pending) {
					pending.add(entry);
				}

				selector.wakeup();
				logger.debug("Trying to connect to " + address);
			} catch (IOException iox) {
				logger.error(iox);
				throw iox;
			}
		} else {
			entry.addMessage(message);
			synchronized (pending) {
				pending.add(entry);
			}
			selector.wakeup();
		}
	}

他从一个Map中去获得连接 SocketEntry ,然后得到连接对象Socket!

判断Socket是否有效,有效则直接发送,无效则创建连接后再发送!

然后我找到这样一段代码

private synchronized void timeoutSocket(SocketEntry entry) {
  if (connectionTimeout > 0) {
    socketCleaner.schedule(new SocketTimeout(entry), connectionTimeout);
  }
} 

也就是说服务端会自己检查的连接并且去清除他!

我尝试设置 connectionTimeout 的值

private void init() throws UnknownHostException, IOException {
  threadPool = ThreadPool.create("Trap", 2);
  dispatcher = new MultiThreadedMessageDispatcher(threadPool,new MessageDispatcherImpl());
  // 本地IP与监听端口
  listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "tcp:192.168.9.69/5055"));
  DefaultTcpTransportMapping transport;
  transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress);
  transport.setConnectionTimeout(0);
  snmp = new Snmp(dispatcher, transport);
  snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
  snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
  snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
  USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
  SecurityModels.getInstance().addSecurityModel(usm);
  snmp.listen();
} 

增加一行代码 设置DefaultTcpTransportMapping的超时时间是 0 !

然后就没有问题了!

虽然临时解决了问题,但是由于对SNMP4J不够深入了解,我怕问题恐怕不是这样的!

我在此也希望使用SNMP4J为工具,且作为服务端,在发送数据时有问题的解决方法!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 商业连锁VPN解决方案

    行业: 零售 功能:VPN,网络 供应商: 深圳市赛蓝科技有限公司 方案正文: 现状与需求随着企业业务的迅速发展,各地分店.连锁店.加盟店.其它异地分支机构等也相继增多,信息交互也越来越频繁,随着企业商业(POS)系统的实施,重要的营业数据.财务数据和相关数据信息在网络中传输也越来越多,安全性要求也越来越重要,目前仅仅依靠Modem拨号.ADSL以及专线的组网模式已经越来越不适应公司对信息传输平台的要求了.连锁经营模式的企业越来越多.这种企业大多数业务是直接为客户提供服务,服务是否到位.是否快捷

  • Win7系统日志提示在没有配置的 DNS 服务器响应之后,名称“域名”的名称解析超时的解放方法

    今天同事说他的笔记本莫名其妙的上不去网了,开始还以为是我做测试,给他搞ip冲突了,结果过去一看并非ip冲突,据了解是周一开始不好用的,之前就周六装过一次QQ管家,而且在家里用无线没问题,到公司里用有线就会出问题,大概1~2个小时左右就会上不去网,打不开网页,QQ也会离线,禁用再启用网卡就好~ 错误日志信息如下: 说实话,自己也没弄明白咋回事,网卡协议并没多任何东西,看上去像是arp欺骗,但是办公室好几台电脑不可能就他被欺骗,于是Google一下,发现有人遇到同样问题. http://www.iv

  • 浅谈java中异步多线程超时导致的服务异常

    在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

  • 小程序server请求微信服务器超时的解决方法

    今天有同学在测试小程序的过程中,发现一个问题,调用 微信官方的服务端接口超时 ,比如这个接口,https://api.weixin.qq.com/sns/jscode2session ,因为我们小程序登录的时候,会在自己server端调用微信的API,这个接口超时,导致我们的登录流程也就挂掉了.本来以为是偶尔的网络问题,但是,同学发现在测试服务器上,很稳定的复现超时!但是在我们本地测试过程中,请求微信服务器又很快响应.嗯,理论上微信服务器不会出问题的-- 试着在服务器上去 curl 微信的接口,

  • 详解Nginx服务器中配置超时时间的方法

    一.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一个请求占用过长时间. 二.主要参数 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75;  链接 fastcgi_read_timeout 600;   读取 fastcgi_send_timeout 600;   发请求 这两个选项.          fastcgi_read_timeout是指

  • php中curl和soap方式请求服务超时问题的解决

    公司中有不少服务是以curl或者soap方式连接第三方公司做的服务来交互数据,最近新增加了个需求,就是第三方服务发版时候,连接不上对方服务器时候要进行重试,其它原因导致的业务处理失败,则按失败处理,不会再进行调用. 思路就是判断curl或者soap连接不上对方服务器时候,抛出TimeoutException异常,捕获后做重试处理,其它错误导致的抛出的Exception则按失败处理. curl处理 $ch = curl_init($url); $options = array( CURLOPT_R

  • 解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询的时候就会报个"MySQL server has gone away"的误,但是有时候,由于mysql服务器那边做了一些设置,很多情况下会缩短这个连接timeout时长以保证更多的连接可用.有时候设置得比较变态,很短,30秒,这样就需要客户端这边做一些操作来保证不要让mysql主动来断开.

  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法

    错误描述:oracle远程连接服务器出现 ORA-12170 TNS:连接超时 错误检查:有很多是oracle自身安装的问题,但是我这里服务器配置正常,监听正常,服务正常,远程可以ping通服务器. 这里主要是防火墙问题,解决办法: (1)关闭防火墙: (2)在防火墙中添加,orcale端口1521例外.

  • SNMP4J服务端连接超时问题解决方案

    我们的网络管理中心作为管理中心,是服务端!各个被管设备通过交换机作为客户端与网管中心进行通信,使用的TCP/IP协议! SNMP只是一种协议包,SNMP4J作为SNMP使用的Java工具包,提供了方便安全的工具包功能! 但是在使用中发现一个问题就是,服务端与客户端发送消息时,发送数次后就不再发送数据了!网络抓包也抓不到,跟踪断点到SNMP4J的代码中发现了这样一个问题! /** * Sends a SNMP message to the supplied address. * * @param

  • Python selenium页面加载慢超时的解决方案

    开发环境: win10-64  python2.7.16  chrome77 from selenium import webdriver driver = webdriver.Chrome(executable_path='chromedriver.exe') driver.get('http://全部加载完成超级慢的网站') user = 'abc' pwd = '123 driver.find_element_by_id('email').send_keys(user) driver.fi

  • Config服务端连接Git配置的技巧

    Config:服务端连接Git配置,代码如下所示: 1.导入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springf

  • 基于springboot服务间Feign调用超时的解决方案

    解决springboot服务间Feign调用超时问题概述 1.起因 在完成项目功能需求的开发,经过自己测试以及通过测试组测试通过后,昨晚正式部署到线上环境进行正式运行前的最后一次的测试.但是在测试中,由A服务调用B服务接口时,***通过Feign调用(其实就是http请求,当A服务调用B服务时,如果不配置超时时间,那么A发出请求后,B应该立即响应,否则A服务会认为B已经断开连接)出现***连接超时的错误,错误信息:Read timed out- 2.原因 用idea开发debug模式调试代码时,

  • mysql服务启动不了解决方案

    最近在Windows 2003上的MySQL出现过多次正常运行时无法连接数据库故障,现象是无法连接数据库,也无法停止MySQL或重启MYSQL,重启机子也没有效果,由于每次都是草草尝试各种方法搞定即可,一直没有深入研究,下次一定把图和故障现象系统归纳一下.本文先列一下常见的解决方法. 启动mysql服务出现如下的错误信息(MySQL服务无法启动): 本地计算机无法启动mysql服务. 错误 1067:进程意外终止. 解决方案: 运行 复制代码 代码如下: Cd C:\Program Files\

  • Python pip使用超时问题解决方案

    引言 之前有位群友在群里发了个问题,说使用pip安装第三方包遇到"Read timeout".我相信很多时候,大家在使用pip都会遇到这个问题,所以,我想有必要写一遍文章来总结一下. 具体如下: 解决方案 在这之前,你要明白一点,直接使用pip安装超时,绝大多数原因是pip源在外国,所以国内使用,网络就算稳定,也有一定超时. 要想解决pip安装软件包超时问题,目前只有两种方式. 第一种:设置延迟时间 这种方式就是直接在pip命令后加入: "--default-timeout=

  • Dubbo服务校验参数的解决方案

    目录 一.背景 二.解决方案 2.1maven依赖 2.2接口定义 2.3Dubbo服务提供者端配置 2.4Dubbo服务消费者端配置 2.5验证参数校验 三.定制Dubbo参数校验异常返回 3.1ValidationFilter&JValidator 3.2自定义参数校验异常返回 3.2.1自定义Filter 3.2.2自定义Filter的配置 3.3.3Dubbo服务配置 四.如何扩展校验注解 4.1定义校验注解 4.2配置定制Validator发现 五.总结 本文分享了如何对Dubbo服务

  • mysql服务1067错误多种解决方案分享

    my.ini在MySQL的目录,于是在同事机器上拷贝了一个my.ini拿来修改,并单独放在一个地方作为备份.其内容如下: 复制代码 代码如下: #Uncomment or Add only the keys that you know how works. #Read the MySQL Manual for instructions [mysqld] basedir=d:/MySQL5.0/ #bind-address=127.0.0.1 datadir=d:/MySQL5.0/data #l

  • Python爬虫headers处理及网络超时问题解决方案

    1.请求headers处理 我们有时请求服务器时,无论get或post请求,会出现403错误,这是因为服务器拒绝了你的访问,这时我们可以通过模拟浏览器的头部信息进行访问,这样就可以解决反爬设置的问题. import requests # 创建需要爬取网页的地址 url = 'https://www.baidu.com/' # 创建头部信息 headers = {'User-Agent':'OW64; rv:59.0) Gecko/20100101 Firefox/59.0'} # 发送网络请求

  • PIP安装docker-compose超时问题解决方案

    1:安装命令 pip install docker-compose 异常信息 socket.timeout: The read operation timed out During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/pip/_internal/cli/

随机推荐