gpt4 book ai didi

java - DatagramChannel 发送上的 native 错误

转载 作者:行者123 更新时间:2023-12-01 13:29:20 24 4
gpt4 key购买 nike

基本

我有一个应用程序,它使用 DatagramChannel.send 在多个线程中发送数据包,每个线程到其自己的 IP 地址/端口,并且每个线程都保持恒定的比特率/带宽。我时不时地收到此错误:

java.net.SocketException: Invalid argument: no further information
at sun.nio.ch.DatagramChannelImpl.send0(Native Method)
at sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(Unknown Source)
at sun.nio.ch.DatagramChannelImpl.send(Unknown Source)
at sun.nio.ch.DatagramChannelImpl.send(Unknown Source)
...

它是随机发生的 - 有时在开始后 5 分钟有时在一天后 - 所以我在复制它进行测试时确实遇到了问题。在我的家用机器上我根本无法重现它。

环境

  • Windows 7、8 和 Server 2012(均为 64 位)
  • 64 位 Java 7 更新 45

更多信息

该应用程序正在将 SI/EIT 数据发送到 DVB-C 网络。我正在为 80-120 个线程中的每个线程创建一个 188 字节数组的列表并供其使用。该线程获取列表并循环列表,直到提供新列表。

  • 该错误通常同时发生在多个 channel 上。但这种情况也可能只发生在一个人身上。
  • 直到我们有 40 多个线程时,该错误才发生。
  • 错误发生在循环列表时,而不是在我将新列表绑定(bind)到线程时。
  • 应用程序没有内存不足。它通常运行最多 70% 分配给 JVM 的内存。
  • 奇怪的部分:如果我运行应用程序的多个实例,每个实例处理约 10 个线程,问题是相同的。

简化的代码示例

for(int i = 0; i < 100; ++i) {
final int id = i;
new Thread(new Runnable() {
@Override
public void run() {
final Random r = new Random();
final List<byte[]> buffer = Lists.newArrayList();
for(int i = 0; i < 200; ++i) {
final byte[] temp = new byte[188];
r.nextBytes(temp);
buffer.add(temp);
}

final SocketAddress target = new InetSocketAddress("230.0.0.18", 1000 + id);
try (final DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET)) {
channel.configureBlocking(false);
channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, NetworkInterface.getByName("eth0"));
channel.setOption(StandardSocketOptions.IP_MULTICAST_TTL, 8);
channel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
channel.setOption(StandardSocketOptions.SO_SNDBUF, 1024 * 64);

int counter = 0;
int index = 0;
while(true) {
final byte[] item = buffer.get(index);
channel.send(ByteBuffer.wrap(item), target);
index = (index + 1) % buffer.size();
counter++;
Thread.sleep(1);
}
}
catch(Exception e) {
LOG.error("Fail at " + id, e);
}
}
}).start();
}
<小时/>

编辑:

1)@EJP:我正在设置多播属性,因为我使用的实际应用程序正在执行连接(并读取一些数据)。但即使在我删除它们之后,问题仍然存在。

2) 如果我只需要发送 UDP 数据包,我是否应该使用其他 API?我能找到的所有示例都使用 DatagramChannel (或其较旧的替代方案)。

3)我仍然坚持这一点。如果有人知道我可以尝试什么,请告诉我。

最佳答案

我遇到了完全相同的问题,这是由调用 send 方法时目标 InetSocketAddress 中的零端口引起的。

在您的代码中,目标端口定义为 1000 + i,因此这似乎不是问题。不管怎样,我会记录抛出异常时使用的目标参数,以防万一。

关于java - DatagramChannel 发送上的 native 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com