我有一些使用 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 库的代码。
关于java - 进行涉及 Java 的 RAW 套接字编程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854961/