我正在通過xinetd超級服務器運行一個小型java服務器。 我想獲得始發客戶端IP,但我不能,因爲流在xinetd和java(stin/stdout)之間。如何通過xinetd從java服務器獲取客戶端IP?
有人知道如何獲得客戶端IP,而無需查看xinetd日誌文件嗎? (對我來說似乎是個不好的解決辦法)
謝謝!
我正在通過xinetd超級服務器運行一個小型java服務器。 我想獲得始發客戶端IP,但我不能,因爲流在xinetd和java(stin/stdout)之間。如何通過xinetd從java服務器獲取客戶端IP?
有人知道如何獲得客戶端IP,而無需查看xinetd日誌文件嗎? (對我來說似乎是個不好的解決辦法)
謝謝!
鑑於你所描述的情況,拖拽xinetd日誌文件是你唯一的選擇。
如果您的Java應用程序正在通過其標準輸入和標準輸出與客戶端交談,則應用程序無法訪問底層套接字。事實上,我認爲你不可以用任何語言來做到這一點。
編輯:實際上,您可能可以在C和C++中執行此操作,因爲它們公開文件描述符(fds)並具有使用fds執行套接字操作的庫API。
但它不會在純Java中工作。即使您可以深入到與System.in
或System.out
關聯的Stream對象內的fd,我也不認爲Java類庫提供了將fd轉換爲Socket
對象的API。要在fd的0和1上執行套接字操作,您需要使用JNI和本機代碼。作爲評論者指出,如果真實客戶端位於代理之後,您從套接字獲得的客戶端IP將是代理的IP。
我想你可以在TCP套接字(但不是UDP)上調用getpeername
,請參閱Stevens chapter 4.10。
這是一個C/C++解決方案,而不是Java解決方案。 – 2010-10-05 00:00:01
是你使用java servlet嗎? – Moro 2010-02-21 12:06:12