执行涉及Java的RAW套接字编程的最佳方法

Knu*_*ubo 11 c java networking java-native-interface

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

socket(AF_INET,SOCK_RAW,1);

我猜Java已经删除了一些禁用Java进程中使用原始套接字的权限.我必须找到解决方案.

我观察到以下情况:

  • 如果我编写一个C程序并使用Runtime从Java调用它,分叉代码可能会打开套接字.
  • 如果我从Eclipse运行这个本机代码,它也可以很好地运行.我想这是因为Eclipse已经从eclipse.exe启动,而不是从java.exe启动.

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

编辑:我越是关注这个问题,我认为它必须与Windows 7的启动方式有关.

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

And*_*ndy 5

也许使用现有的Java native socket lib?然后您不必担心编写JNI库.

请参阅:http://www.savarese.com/software/rocksaw/