如何在没有 TCP/IP 堆栈的情况下用 Java 发送以太网帧

2024-01-03

我的 Java 应用程序应该控制直接连接到我的计算机(Ubuntu 和 Windows)网络接口的外部设备(EtherCAT 总线技术)。没有连接其他网络设备。通信是在标准 IEEE 802.3 以太网帧上完成的,无需 IP 堆栈。

发送数据示例:

int etherType =  0x88A4;  // the EtherType registered by IEEE
byte[] macBroadcast = new byte[] {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
byte[] macSource = new byte[] ... ;  // MAC Address of my network interface card
byte[] buffer = ... // the data to send

device.write(macSource, macBroadcast, etherType, buffer);

I tried JNetPcap,它使用pcap本机库。给定的API很好,但是在重负载下存在多线程问题,这迫使我放弃。

netty.io也是一名候选人。我不确定,但 TCP/IP 堆栈是强制性的。我对吗?

还有其他与低级以太网帧通信的想法吗?我更喜欢像 netty.io 这样的纯 java 库(如果存在的话)。

当然 JNA/JNI 也是一种选择。但我不想写C代码。

其他选择?


这些是我能够找到的选项:

  • jNetPcap 是 Java 的 libpcap 包装器 -http://jnetpcap.com/ http://jnetpcap.com/
  • Jpcap 是另一个 Java 的 libpcap 包装器 -https://github.com/mgodave/Jpcap https://github.com/mgodave/Jpcap
  • RockSaw 是一个使用“原始套接字”发送和接收 IPv4 和 IPv6 数据包的库 -http://www.savarese.org/software/rocksaw/ http://www.savarese.org/software/rocksaw/。据我所知,它的范围非常有限,并且自 2007 年以来就没有被触及过。
  • Netutils 使用 libpcap 和 libnet -http://code.google.com/p/netutils/ http://code.google.com/p/netutils/

我还看到过一些评论,大意是 jNetPcap 应该是线程安全的,但实际上并非如此;即,当与多个线程一起使用时,它是有问题的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有 TCP/IP 堆栈的情况下用 Java 发送以太网帧 的相关文章

随机推荐