我的是一个 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 发来的数据返回不了?

解决方案 »

  1.   

    能不能不把DatagramPackage这块代码贴些出来
      

  2.   

    以下是org.snmp4j.transport.DefaultUdpTransportMapping类的一个方法,我没有对方法做任何修改.拆包过程也不是我手动,而是SNMP4J框架进行的. 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());
    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);
    }
      

  3.   

    提的问题不知所云啊
    at org.snmp4j.transport.DefaultUdpTransportMapping.sendMessage(DefaultUdpTransportMapping.java:115) 
    这115行到底是哪句
      

  4.   

    那些DEBUG都是我自己加的.原来代码就是这样.
    主要是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);
        }
      

  5.   

    rg.snmp4j.MessageException: Invalid argument
    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有么有高人啊?救命啊