2010-02-21 120 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

相关问题