我正在通过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