问题描述:
三台服务器分别为:serverA(ipA,portA)、serverB(ipB,portB)、serverC(ipC、portC).
从serverA上发一个pdu到serverB上,serverB接收到serverA发来的pdu后直接转发给serverC,
serverC接收到来自serverB发来的pdu后发现其ip地址不是serverA的地址ipA,而是serverB的地址ipB,
这样就导致pdu的源地址丢失了。
(丢失的ip地址是指event.getPeerAddress。event是processPdu(CommandResponderEvent event)方法中的参数,
processPdu(CommandResponderEvent event)方法属于SNMP4J.jar包中CommandResponder接口)
*******serverB的代码如下:*******
/**
* serverB服务代码。
*
* 实现CommandResponder的processPdu方法, 用于接收传入的PDU,然后转发到目标serverC去
* 当接收到pdu时,会自动进入这个方法。
*
* @param respEvnt
*/
public void processPdu(CommandResponderEvent event) {
//下面从event中取出来的ip是:谁给他发的pud,这ip地址就是谁的。
//这样就出问题了,从serverA到serverC,pdu经过serverB的转发,
//最后得到的ip地址成了serverB的了,把源ip地址ipA给丢了.
//请看看怎么处理才能保证不丢失ipA这个源地址。
String ip = event.getPeerAddress().toString();
// 设置 target(也就是serverC)
CommunityTarget target = new CommunityTarget();
//目标地址,也就是serverC的地址
Address targetAddress = new org.snmp4j.smi.UdpAddress(java.net.InetAddress
.getByName(ipC), portC);
target.setAddress(targetAddress);
// 通信不成功时的重试次数
target.setRetries(2);
// 超时时间
target.setTimeout(1500);
// snmp版本
target.setVersion(SnmpConstants.version2c);
// 接收到来自serverA的pdu,转发到目标serverC去
PDU pdu = event.getPDU();
TransportMapping sendTransport = new DefaultUdpTransportMapping();
Snmp sendSnmp = new Snmp(sendTransport);
sendTransport.listen();
sendSnmp.send(pdu, target);
}
联系客服