Newsgroup: it.comp.java
Titolo: Ricavare proprio indirizzo IP

Posto di nuovo la domanda perch� mi sembra davvero strano che non siate 
riusciti a darmi una risposta quindi forse mi sono spiegato male io, 
cercher� di riformularla in altro modo.
L'applicazione che sto sviluppando esegue una query su un database Oracle 
del tipo INSERT INTO eventi (id, azione, ora) VALUES (numero, evento, 
timestamp).
Il mio professore mi ha chiesto di modificare questa query in modo che nella 
tabella del DB venga inserito anche l'indirizzo IP dell'applicazione che 
effettua l'azione indicata.
Praticamente la tabella costituirebbe una sorta di registro eventi 
all'interno della quale vanno registrate tutte le operazioni che un utente 
effettua nell'applicazione.
A questo punto la mia domanda � semplice: esiste un modo per ricavare 
l'indirizzo IP col quale l'applicazione si sta connettendo al mondo esterno 
(per esempio al DB server)?
Grazie per l'aiuto
Saluti
-- 
Elminster 


-- 

 Elminster
InetAddress.getLocalhost().getHostAddress()
ciao
Alex

 InetAddress.getLocalhost().getHostAddress()
che succede però se hai più interfacce e quindi più IP,
oltre al loopback ovviamente ?
-- 

 --
Ciao...
infatti vi invito a provare il codice sopra su linux e su
windows.....:)
l.

 e controlli tutti gli indirizzi di tutte le interfacce.
si, ma la domanda era come ricavare l'indirizzo IP da cui
si sta accedendo al database, non la lista di tutti gli IP
in uso sul client...
credo che solo attraverso il gestore della connessione col
DB si possa direttamente o indirettamente arrivare a sapere
su che interfaccia si sta lavorando, a meno di non averla
forzata manualmente, ovviamente...
-- 

 forzata manualmente, ovviamente...
Dando un'occhiata agli IP, alle netmask e ai percorsi di routing IMHO si 
può risalire a dove passano i dati. Serve un po' di conoscenza del 
TCP/IP e del routing.
Enrico

 se stai usando JDBC hai provato Connection.getClientInfo() ?
Mi s che è proprio quello che fa al caso mio... ma non riesco bene a 
estrapolare l'IP dal valore restituito da getClientInfo(): qualcuno più 
esperto di me sa darmi lumi?
-- 
Elminster 

 su che interfaccia si sta lavorando,
Esattamente... è proprio questo il punto!
Io uso JDBC e mi connetto a un database Oracle: qualcuno sa come posso fare?
-- 
Elminster 


-- 


-- 

 Saluti
A parte il fatto che se serve come logging non pu� essere il client a 
decidere cosa scrivere, ma ci vorrebbe un trigger sulla tabella, puoi 
usare le funzioni di Oracle (che sa chi � connesso) invece che cercare 
una difficile soluzione con Java. Ti serve la funzione PL/SQL:
SELECT SYS_CONTEXT('USERENV','IP_ADDRESS')

 TCP/IP e del routing.
ma può non essere sufficiente.
l'indirizzo con cui ti presenti potrebbe non essere nessuno di quelli 
delle interfacce, se fra te e il database c'è un router che "nasconde" 
il tuo indirizzo con il nat.

 il tuo indirizzo con il nat.
Difatti ho parlato di routing: leggendo anche la tabella di routing puoi 
dedurre dove il pacchetto passerà. Poi, se c'è un NAT in mezzo, allora 
bisogna cambiare strategia, ovvero deve essere il server a comunicarlo.
Enrico

 Elminster
Elminster puoi utilizzare un codice simile al seguente per ricavare
l'IP del client
try {
     InetAddress thisIp =
        InetAddress.getLocalHost();
     System.out.println("IP:"+thisIp.getHostAddress());
     }
    catch(Exception e) {
     e.printStackTrace();
     }
    }
Ciao
Carmelo
-
http://carmelosaffioti.blogspot.com
-

 SELECT SYS_CONTEXT('USERENV','IP_ADDRESS')
Ma come faccio a eseguirla da dentro l'applicazione Java?
Statement.execute si aspetta un boolean come valore di ritorno, 
Statement.executeQuery non posso usarlo perch� mi dice che manca la parola 
chiave FROM nella query: come posso fare?
-- 
Elminster 

     }
Mi stampa: 192.168.1.100, cio� il mio indirizzo IP nella rete locale, non 
quello all'esterno.
-- 
Elminster 


Provo a fare così:
Properties prop = db.getClientInfo();
E mi dà questa eccezione:
Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError: 
oracle.jdbc.driver.T4CConnection.getClientInfo()Ljava/util/Properties;
Sapete dirmi che vuol dire?
-- 
Elminster 

 oracle.jdbc.driver.T4CConnection.getClientInfo()Ljava/util/Properties;
solitamente accade quando la versione della libreria che stai usando è
cambiata DOPO che hai compilato il codice che la usa: se si invoca
un metodo con una certa signature e quella signature è stata modificata
nella nuova libreria, quando la VM va a cercare il metodo giusto nella  
nuova
libreria non lo trova e va in palla...
possibile che il driver per oracle non supporti quel metodo ?
che dice la documentazione oracle ?
-- 

 che dice la documentazione oracle ?
Dice questo:
http://www.oracle.com/technology/sample_code/products/forms/extracted/getclientinfo/src/oracle/forms/demos/GetClientInfo.java
Possibile che la versione 10g XE che sto usando io non lo supporti?
Non sono riuscito a trovare questa info da nessuna parte sul sito di Oracle: 
consigli per scoprirlo o suggerimenti su cosa provare per aggirare/risolvere 
il problema?
-- 
Elminster 

> Possibile che la versione 10g XE che sto usando io non lo supporti?
Connection.GetClientInfo è stato introdotto con la versione 6 di java,
magari il driver che usi non lo supporta perchè sviluppato per una
versione precedente...
-- 

 versione precedente...
Quindi nessun'altra soluzione? :(
-- 
Elminster 

> Quindi nessun'altra soluzione? :(
non che io sappia, così al volo...
magari c'è modo d forzare il driver ad usare una connessione che
hai instaurato tu, così che sai già da prima quale IP userà.....
ma io non userei questo approccio, non mi piace forzare le cose
-- 

 parola chiave FROM nella query: come posso fare?
Devi usare la seguente sintassi nell'executeQuery:
"SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') FROM DUAL"
e vedi che ti funziona.
Raffaele.


una soluzione potrebbe essere quella di aggiungere l'ip
ai campi da aggiungere alla insert,
la richiesta del prof è loggare chi ha fatto la richiesta
l'indirizzo ip del client che invoca la action si può ricavare dalla
request
gli aggiungerei anche il remoteUser
e il dominio da cui parte la richiesta,
ma sono convinto che aggiungere l'ip del client alla insert
sia sufficente
paolo

 esterno (per esempio al DB server)?
Soluzione proprietaria Oracle e non portabile su altri DB:
insert into table (col1, col2, ..., client_ip) values (?, ?, ...,
SYS_CONTEXT('USERENV','IP_ADDRESS'));

 request
Ma come faccio a ricavarlo questo benedetto indirizzo IP?
Ho a che fare con un applicazione Java stand-alone, non una servlet o altre 
applicazioni web.
-- 
Elminster