Как получить клиентский IP с сервера java через xinetd?
Я использую небольшой Java-сервер через суперсервер xinetd. Я хотел бы получить исходный IP-адрес клиента, но не могу, потому что потоки находятся между xinetd и java (stin/stdout).
Кто-нибудь знает, как получить клиентский IP, не заглядывая в xinetd logfile? (кажется плохим решением для меня)
Спасибо!
2 ответа
Учитывая ситуацию, которую вы описали, траление файла журнала xinetd - ваш единственный вариант.
Если ваше Java-приложение общается с клиентом через стандартный ввод и стандартный вывод, приложение не может получить доступ к нижележащему сокету. На самом деле, я не думаю, что вы могли бы сделать это на любом языке.
РЕДАКТИРОВАТЬ: на самом деле, вы, вероятно, могли бы сделать это в C и C++, потому что они предоставляют файловые дескрипторы (fds) и имеют библиотечные API для выполнения операций с сокетами с использованием fds.
Но это не будет работать в чистой Java. Даже если бы вы могли детализировать до fd внутри объектов Stream, связанных с System.in
или же System.out
Я не думаю, что библиотеки классов Java предоставляют API для превращения fd в Socket
объект. Для выполнения операций с сокетами на fd's 0 и 1 вам нужно прибегнуть к JNI и нативному коду.
И, как указывает комментатор, если реальный клиент находится за прокси-сервером, IP-адрес клиента, который вы получаете из сокета, будет IP-адресом прокси.
Я думаю, что вы можете позвонить getpeername
о сокетах TCP (но не UDP), см. главу 4.10 Стивенса.