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

我有一些现有的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()方法。

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

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

您也可以尝试java.net.InetAddress.isReachable()方法,这可以从J2SE5开始提供。

但它在Windows中无法正常工作。 请参阅: http : //bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html