我正在通过 xinetd 超级服务器运行一个小型 Java 服务器。我想获取原始客户端 IP,但我不能,因为流位于 xinetd 和 java (stin/stdout) 之间。
有人知道如何在不查看 xinetd 日志文件的情况下获取客户端 IP 吗?(对我来说似乎是一个不好的解决方案)
谢谢 !
鉴于您所描述的情况,搜索 xinetd 日志文件是您唯一的选择。
如果您的 Java 应用程序通过其标准输入和标准输出与客户端通信,则应用程序无法访问底层套接字。事实上,我认为你不能用任何语言做到这一点。
编辑:实际上,您可能可以在 C 和 C++ 中执行此操作,因为它们公开文件描述符 (fds) 并具有用于使用 fds 执行套接字操作的库 API。
但它不适用于纯 Java。即使您可以深入到与System.in
or关联的 Stream 对象中的 fd System.out
,我也不认为 Java 类库提供了将 fd 转换为Socket
对象的 API。要在 fd 的 0 和 1 上执行套接字操作,您需要使用 JNI 和本机代码。
正如评论者指出的那样,如果真正的客户端在代理后面,那么您从套接字获得的客户端 IP 将是代理的 IP。
我认为您可以调用getpeername
TCP 套接字(但不能调用 UDP),请参阅Stevens 第 4.10 章。