Comment obtenir IP du client à partir du serveur Java via xinetd?
Question
Je suis en cours d'exécution d'un petit serveur java par SuperServer xinetd. Je voudrais obtenir l'adresse IP du client d'origine, mais je ne peux pas parce que les flux sont entre xinetd et java (Stin / stdout).
Quelqu'un sait comment obtenir l'adresse IP du client, sans regarder à xinetd logfile? (Semble une mauvaise solution pour moi)
Merci!
La solution
Compte tenu de la situation que vous avez décrite, la pêche au chalut dans le fichier journal xinetd est votre seule option.
Si votre application Java parle au client via son entrée et la sortie standard, il n'y a aucun moyen pour l'application d'accéder à la prise sous-jacente. En effet, je ne pense pas que vous pouvez le faire dans toutes les langues.
EDIT :. En fait, vous pourriez probablement faire en C et C ++, car ils exposent les descripteurs de fichiers (fds) et ont des API bibliothèque pour effectuer des opérations de socket en utilisant fds
Mais il ne fonctionnera pas en Java pur. Même si vous pouvez percer jusqu'à la fd à l'intérieur des objets de flux associés à System.in
ou System.out
, je ne pense pas que les bibliothèques de classes Java fournissent une API pour transformer le fd dans un objet Socket
. Pour effectuer des opérations de prise sur le fd de 0 et 1 vous auriez besoin de recourir à JNI et du code natif.
Et comme l'intervenant souligne, si le client réel est derrière un proxy, l'adresse IP du client que vous obtenez de la prise sera l'adresse IP du proxy.
Autres conseils
Je pense que vous pouvez appeler getpeername
sur les sockets TCP (mais pas UDP), voir chapitre Stevens 4.10 .