java - 进行涉及 Java 的 RAW 套接字编程的最佳方法

标签 java c networking java-native-interface

我有一些使用 ICMP 原始套接字执行 Ping 的现有 C 代码,我需要在 Java 中使用此代码,因为 Java 不支持 ICMP 包。当我将代码包装在 JNI 中并调用它时,C 代码在执行以下操作时无法获取套接字:

套接字(AF_INET, SOCK_RAW, 1);

我猜想 Java 放弃了一些特权,这些特权禁止 Java 进程使用原始套接字。这我必须找到解决办法。

我观察到以下情况:

  • 如果我编写一个 C 程序并使用运行时从 Java 调用它, fork 代码可能会打开套接字。
  • 如果我从 Eclipse 运行 native 代码,它也能很好地运行。我猜这是因为 Eclipse 是从 eclipse.exe 启动的,而不是从 java.exe 启动的。

这意味着我可以通过选择这两种策略中的一种来解决我的问题,但我都不喜欢。有没有其他方法可以让 Java 接受 JNI 代码打开这个套接字?

编辑: 我对这个问题的研究越深入,我认为这一定是与 Java 启动方式有关的 Windows 7 相关问题。

看起来,如果您让 Windows 正常运行,或者如果您在 Windows 以外的其他平台上,也可以使用 InetAddress.isReachable() 方法。

最佳答案

也许使用现有的 Java native 套接字库?这样您就不必担心编写 JNI 库的代码。

参见:http://www.savarese.com/software/rocksaw/

关于java - 进行涉及 Java 的 RAW 套接字编程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854961/

相关文章:

c - float 组到字节转换为 null

c - 尝试用 C 语言在文件的每一行末尾写入?

c++ - 联网方式

docker-compose macvlan 无法访问互联网

java - 递归方法中的泛型

java - 将数据保存在数据库或 session 中

java - WordCount Mapreduce 程序中的 IO 异常 "System cannot find the file specified"

java - java中字节形式的字符串转为原始字符串

c - fgets() 工作很笨拙

algorithm - 出现 3 个错误,因此 CRC 算法将导致误报