2010-10-04 13 views
11

Tengo un código C existente que usa sockets sin procesar ICMP para hacer Ping y necesito usar este código en Java ya que Java no admite paquetes ICMP. Cuando envuelvo el código en JNI y lo llamo, el código C no puede obtener el socket al hacer:La mejor manera de hacer una programación de socket RAW con Java

socket (AF_INET, SOCK_RAW, 1);

Supongo que Java ha eliminado algunos privilegios que inhabilitan el uso del socket sin formato del proceso de Java. Esto debo encontrar una solución para.

he observado lo siguiente:

  • Si escribo un programa de C y llamo a eso de Java utilizando el código de tiempo de ejecución en forma de horquilla puede abrir el zócalo.
  • Si ejecuto este código nativo de Eclipse, también se ejecuta correctamente. Supongo que esto proviene del hecho de que Eclipse se ha iniciado desde eclipse.exe, y no desde java.exe.

Esto significa que podría resolver mi problema eligiendo una de estas dos estrategias, pero tampoco me gusta. ¿Hay otras formas en que logre que Java acepte que el código JNI está abriendo este socket?

Editar: Cuanto más miro este problema, me imagino que debe ser un problema relacionado con Windows 7 con respecto a cómo se inicia Java.

También parece que si tiene ventanas para comportarse o si se encuentra en otra plataforma que no sea Windows, también podría usarse el método InetAddress.isReachable().

Respuesta

5

¿Quizás use un lib existente de Java native socket? Entonces no tienes que preocuparte por codificar la lib de JNI.

Ver: http://www.savarese.com/software/rocksaw/

+0

Esta biblioteca se ve genial. Aunque está haciendo lo mismo que nuestro código nativo, mi problema debe estar relacionado con Windows. – Knubo

+0

Sí, creo que escribir bibliotecas JNI es un poco doloroso. Entonces, cuando tenga dudas, use algo que ya exista. ¿Obtuviste esta lib para trabajar con Windows 7 o también está fallando? – Andy

+0

Decidimos ir con Runtime.exec() ya que tenemos que resolverlo y seguir avanzando. Creo que tu respuesta es la mejor hasta el momento y realmente debería resolver mi pregunta, aunque no es mi problema, así que lo aceptaré :) – Knubo

0

Es lo mismo que tratar el método java.net.InetAddress.isReachable(), está disponible a partir J2SE5 en adelante.

Pero no está funcionando como se esperaba en Windows. Ver: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html

+0

Este método no es adecuado para el caso de uso que tenemos que hacer, y también necesitamos que funcione en Windows. – Knubo

+1

Este método funciona correctamente solo cuando tiene permiso de cuenta de root: envía una solicitud de ECHO de ICMP sin procesar en ese caso; de lo contrario, intenta establecer una conexión TCP en el puerto 7 (servicio de eco) que no siempre está abierto. Por lo tanto, fallará en algunos casos, cuando Java no se haya ejecutado desde la cuenta raíz. –

Cuestiones relacionadas