2010-02-21 164 views
1

我正在通過xinetd超級服務器運行一個小型java服務器。 我想獲得始發客戶端IP,但我不能,因爲流在​​xinetd和java(stin/stdout)之間。如何通過xinetd從java服務器獲取客戶端IP?

有人知道如何獲得客戶端IP,而無需查看xinetd日誌文件嗎? (對我來說似乎是個不好的解決辦法)

謝謝!

+0

是你使用java servlet嗎? – Moro 2010-02-21 12:06:12

回答

1

鑑於你所描述的情況,拖拽xinetd日誌文件是你唯一的選擇。

如果您的Java應用程序正在通過其標準輸入和標準輸出與客戶端交談,則應用程序無法訪問底層套接字。事實上,我認爲你不可以用任何語言來做到這一點。

編輯:實際上,您可能可以在C和C++中執行此操作,因爲它們公開文件描述符(fds)並具有使用fds執行套接字操作的庫API。

但它不會在純Java中工作。即使您可以深入到與System.inSystem.out關聯的Stream對象內的fd,我也不認爲Java類庫提供了將fd轉換爲Socket對象的API。要在fd的0和1上執行套接字操作,您需要使用JNI和本機代碼。作爲評論者指出,如果真實客戶端位於代理之後,您從套接字獲得的客戶端IP將是代理的IP。

+0

...以及底層套接字可能只有最近代理的源IP:端口信息,而不是實際的客戶端。 – EJP 2010-02-21 22:19:41

+0

仍然有通過getpeername(可能需要或不需要JNI)的方法。 – ShiDoiSi 2010-10-04 17:24:38

+0

它需要JNI,因爲getPername不存在於Java套接字API中。 – 2010-10-04 23:59:17

0

我想你可以在TCP套接字(但不是UDP)上調用getpeername,請參閱Stevens chapter 4.10

+0

這是一個C/C++解決方案,而不是Java解決方案。 – 2010-10-05 00:00:01

相關問題