[高级]UDP 数据发送失败:java.io.IOException: Invalid argument

商科程序员 2010-08-26 01:54:34
我的是一个 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 发来的数据返回不了?
...全文
1029 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weborn_liang 2011-04-01
  • 打赏
  • 举报
回复
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

有么有高人啊?救命啊。。。
商科程序员 2010-09-08
  • 打赏
  • 举报
回复
那些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);
}
cyhu 2010-09-08
  • 打赏
  • 举报
回复
没看明白
商科程序员 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chouy 的回复:]
以下是org.snmp4j.transport.DefaultUdpTransportMapping类的一个方法,我没有对方法做任何修改.拆包过程也不是我手动,而是SNMP4J框架进行的.

Java code

protected DatagramSocket socket = null;
public void sendMessage(Address targetAd……
[/Quote]
最后一句.
yaoweijq 2010-08-30
  • 打赏
  • 举报
回复
提的问题不知所云啊
at org.snmp4j.transport.DefaultUdpTransportMapping.sendMessage(DefaultUdpTransportMapping.java:115)
这115行到底是哪句。。。
[Quote=引用楼主 chouy 的回复:]
我的是一个 SNMP 应用程序,本来是监听虚通道的 161 端口,现在在前面加了个代理。
由代理监听 161 端口,我的程序监听 0.0.0.0 的 18161 端口,代理收到数据后在数据外中做一些修改,然后发给我。
我的程序应按 snmp 报文处理,把取的值填入 PDU 后直接发回给数据发送端(注意,不是代理端)。
结果报错:
java.io.IOException: Invalid a……
[/Quote]
商科程序员 2010-08-30
  • 打赏
  • 举报
回复
以下是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);
}
xtuxucj 2010-08-27
  • 打赏
  • 举报
回复
能不能不把DatagramPackage这块代码贴些出来
商科程序员 2010-08-27
  • 打赏
  • 举报
回复
自己顶一下.
最近问的问题都在论坛上没人给答案.
不知道是问题太难,还是没有高人,还是不屑回答.
内容概要:本文介绍了COSO企业风险管理框架,阐述了企业风险管理的定义、目标、构成要素及其与内部控制的关系。文章指出,企业风险管理是一个由董事会、管理层及其他人员实施的,应用于战略制定并贯穿于企业之中的过程,旨在识别可能影响主体的潜在事项,管理风险以使其在该主体的风险容量之内,并为主体目标的实现提供合理保证。该框架强调了企业风险管理的八大构成要素:内部环境、目标设定、事项识别、风险评估、风险应对、控制活动、信息与沟通、监控。此外,文章还讨论了企业风险管理的局限性,如人为判断失误、成本与效益的权衡、管理层凌驾等。 适合人群:具备一定管理学基础知识,对风险管理有兴趣的学者、企业管理人员、内部审计师及外部审计师。 使用场景及目标:①帮助组织理解并应用企业风险管理框架,以提高组织的风险管理水平;②指导企业如何通过有效的风险管理来实现其战略、经营、报告和合规目标;③为企业提供一套标准化的风险管理语言,促进内外部沟通与合作。 阅读建议:读者应结合实际案例,深入理解每个构成要素的具体应用,同时关注企业风险管理的局限性,以全面把握企业风险管理的本质。此外,建议定期回顾和更新风险管理策略,以适应不断变化的内外部环境。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧