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().
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
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
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