2010-10-04 10 views
11

Ho un codice C esistente che utilizza socket raw ICMP per fare Ping e ho bisogno di usare questo codice in Java poiché Java non supporta i pacchetti ICMP. Quando si avvolge il codice in JNI e lo si chiama, il codice C non riesce a ottenere il socket quando si esegue:Il modo migliore per eseguire la programmazione socket RAW con Java

socket (AF_INET, SOCK_RAW, 1);

Immagino che Java abbia eliminato alcuni privilegi che disabilitano l'utilizzo del socket raw dal processo Java. Questo devo trovare una soluzione a.

ho osservato quanto segue:

  • Se scrivo un programma in C e lo chiamo da Java Runtime utilizzando il codice biforcuta può aprire la presa.
  • Se eseguo questo codice nativo da Eclipse, funziona egregiamente. Immagino che questo derivi dal fatto che Eclipse è stato avviato da eclipse.exe e non da java.exe.

Ciò significa che potrei risolvere il mio problema scegliendo una di queste due strategie, ma non mi piace nessuno dei due. Ci sono altri modi in cui posso convincere Java ad accettare che il codice JNI stia aprendo questo socket?

Modifica: Quanto più guardo a questo problema, penso che debba trattarsi di un problema relativo a Windows 7 relativo all'avvio di Java.

Sembra inoltre che se si ottiene il comportamento di Windows o se si è su un'altra piattaforma diversa da Windows, è possibile utilizzare anche il metodo InetAddress.isReachable().

risposta

5

Forse usare una lib di socket nativa Java esistente? Quindi non devi preoccuparti di codificare la lib di JNI.

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

+0

Questa libreria è eccezionale. Sta facendo lo stesso che il nostro codice nativo sta già facendo, quindi il mio problema deve essere relativo a Windows. – Knubo

+0

Sì, trovo che scrivere librerie JNI sia un po 'doloroso. Quindi, quando sei nel dubbio, usa qualcosa che esiste già. Hai ottenuto il funzionamento di questa libreria con Windows 7 o non funziona? – Andy

+0

Abbiamo deciso di utilizzare il Runtime.exec() perché dobbiamo risolverlo e andare avanti. Penso che la tua risposta sia la migliore finora e dovrebbe davvero risolvere la mia domanda anche se non il mio problema, quindi accetterò :) – Knubo

0

Si potrebbe anche provare il metodo java.net.InetAddress.isReachable(), questo è disponibile da J2SE5 in poi.

Ma non funziona come previsto in Windows. Vedi: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html

+0

Questo metodo non è adatto per il caso d'uso che dobbiamo fare e abbiamo bisogno che funzioni anche su Windows. – Knubo

+1

Questo metodo funziona correttamente solo quando si dispone dell'autorizzazione all'account di root: in tal caso invia richieste ECHO ICMP non elaborate, altrimenti tenta di stabilire una connessione TCP sulla porta 7 (servizio echo) che non è sempre aperta. Pertanto, in alcuni casi, fallirà quando Java non è stato eseguito dall'account root. –

Problemi correlati