我的是一个 SNMP 应用程序,本来是监听虚通道的 161 端口,现在在前面加了个代理。
由代理监听 161 端口,我的程序监听 0.0.0.0 的 18161 端口,代理收到数据后在数据外中做一些修改,然后发给我。
我的程序应按 snmp 报文处理,把取的值填入 PDU 后直接发回给数据发送端(注意,不是代理端)。
结果报错:
java.io.IOException: Invalid argument
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:612)
at org.snmp4j.transport.DefaultUdpTransportMapping.sendMessage(DefaultUdpTransportMapping.java:115)
at org.snmp4j.MessageDispatcherImpl.sendMessage(MessageDispatcherImpl.java:183)
。明显是调用 JVM 底层的发送数据接口失败。
如果我用 snmpget 命令访问代理,数据可以正常返回。哪位高手清楚 UDP 的数据传输方式?对方的目的地址如果是一个IP,响应数据的源地址变成了另一个IP,会不会有问题。
如果有问题,为什么本地的数据代理返回没问题,其它 IP 发来的数据返回不了?
由代理监听 161 端口,我的程序监听 0.0.0.0 的 18161 端口,代理收到数据后在数据外中做一些修改,然后发给我。
我的程序应按 snmp 报文处理,把取的值填入 PDU 后直接发回给数据发送端(注意,不是代理端)。
结果报错:
java.io.IOException: Invalid argument
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:612)
at org.snmp4j.transport.DefaultUdpTransportMapping.sendMessage(DefaultUdpTransportMapping.java:115)
at org.snmp4j.MessageDispatcherImpl.sendMessage(MessageDispatcherImpl.java:183)
。明显是调用 JVM 底层的发送数据接口失败。
如果我用 snmpget 命令访问代理,数据可以正常返回。哪位高手清楚 UDP 的数据传输方式?对方的目的地址如果是一个IP,响应数据的源地址变成了另一个IP,会不会有问题。
如果有问题,为什么本地的数据代理返回没问题,其它 IP 发来的数据返回不了?
public void sendMessage(Address targetAddress, byte[] message) throws java.io.IOException
{
InetSocketAddress targetSocketAddress = new InetSocketAddress(((UdpAddress) targetAddress).getInetAddress(),
((UdpAddress) targetAddress).getPort());
logger.info(
"Sending message to " + targetAddress.toString() + " with length " + message.length + ": "
+ new OctetString(message).toHexString());
logger.info("targetSocketAddress=" + targetSocketAddress.toString());
logger.info(socket.getInetAddress() + " " + socket.getLocalPort() + " " + socket.getLocalSocketAddress() + " " + socket.getRemoteSocketAddress());
DatagramPacket packet = new DatagramPacket(message, message.length, targetSocketAddress);
logger.info("ip:" + targetSocketAddress.getHostName() + ", port:" + targetSocketAddress.getPort());
logger.info("-----------my own sock -------------");
// logger.info(targetSocketAddress.getAddress().getHostAddress());
InetSocketAddress isa = new InetSocketAddress(targetSocketAddress.getHostName(), targetSocketAddress.getPort());
DatagramPacket packet2 = new DatagramPacket(message, message.length, isa);
DatagramSocket socket2 = new DatagramSocket();
socket2.send(packet2);
logger.info("-----------my own sock success -------------");
socket.send(packet);
}
at org.snmp4j.transport.DefaultUdpTransportMapping.sendMessage(DefaultUdpTransportMapping.java:115)
这115行到底是哪句
主要是DatagramSocket在发送数据时报错.注意,不是空指针.我上面写=null只是表示它的数据类型.
protected DatagramSocket socket = null;
public void sendMessage(Address targetAddress, byte[] message) throws java.io.IOException
{
InetSocketAddress targetSocketAddress = new InetSocketAddress(((UdpAddress) targetAddress).getInetAddress(),
((UdpAddress) targetAddress).getPort());
DatagramPacket packet = new DatagramPacket(message, message.length, targetSocketAddress);
socket.send(packet);
}
at org.snmp4j.MessageDispatcherImpl.sendPdu(MessageDispatcherImpl.java:479)
at org.snmp4j.Snmp.sendMessage(Snmp.java:1078)
at org.snmp4j.Snmp.send(Snmp.java:891)
at org.snmp4j.Snmp.send(Snmp.java:871)
at org.snmp4j.Snmp.send(Snmp.java:836)
at com.network.manage.common.util.SnmpOperation.operation(SnmpOperation.java:106)
我也遇到同样的问题,不过环境是RedHat+Sybase有么有高人啊?救命啊