Как получить клиентский IP с сервера java через xinetd? - PullRequest
1 голос
/ 21 февраля 2010

Я использую небольшой сервер Java через суперсервер xinetd. Я хотел бы получить исходный IP-адрес клиента, но не могу, потому что потоки находятся между xinetd и java (stin / stdout).

Кто-нибудь знает, как получить клиентский IP, не заглядывая в xinetd logfile? (мне кажется, это плохое решение)

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Учитывая ситуацию, которую вы описали, траление файла журнала xinetd - ваш единственный вариант.

Если ваше Java-приложение общается с клиентом через стандартный ввод и стандартный вывод, приложение не может получить доступ к нижележащему сокету. На самом деле, я не думаю, что вы могли бы сделать это на любом языке.

EDIT : на самом деле вы, вероятно, могли бы сделать это в C и C ++, потому что они предоставляют файловые дескрипторы (fds) и имеют библиотечные API для выполнения операций с сокетами с использованием fds.

Но это не будет работать на чистой Java. Даже если бы вы могли перейти к fd внутри объектов Stream, связанных с System.in или System.out, я не думаю, что библиотеки классов Java предоставляют API для превращения fd в Socket объект. Для выполнения операций с сокетами на полях 0 и 1 вам потребуется использовать JNI и собственный код.

И, как указывает комментатор, если реальный клиент находится за прокси-сервером, IP-адрес клиента, который вы получаете из сокета, будет IP-адресом прокси.

0 голосов
/ 04 октября 2010

Я думаю, вы можете вызвать getpeername на сокетах TCP (но не UDP), см. глава Стивенса 4.10 .

...