如何在 Java 中调用 getsockopt 以获取 SO_ORIGINAL_DST

Posted

技术标签:

【中文标题】如何在 Java 中调用 getsockopt 以获取 SO_ORIGINAL_DST【英文标题】:How can I call getsockopt in Java to get SO_ORIGINAL_DST 【发布时间】:2012-03-26 05:16:14 【问题描述】:

有谁知道是否有一个现有的库可以让我调用 getsockopt 以获取 iptables 通过我的 Java 应用程序重新路由的套接字的目标 IP?

Here's a similar question 在未答复的 Netty 邮件列表中。

c 中的调用类似于:

getsockopt(ctx->client.fd, SOL_IP, 
    SO_ORIGINAL_DST, &SANY_ADDR(addr), &SANY_LEN(addr))

也欢迎提供如何使用 JNI 执行此操作的示例。

【问题讨论】:

【参考方案1】:

你不能在 Java 中做到这一点。你可以完全按照你写的那样在 JNI 中做,如果你能得到套接字 FD,它在 SocketSocketImpl 中。

【讨论】:

@downvoter 如果您认为它可以在没有 JNI 的 Java 中完成,请与我们分享您的解决方案,以便对其进行评论、投票等。【参考方案2】:

你不能在 Java 中做到这一点。但是,您可以添加存储 original_dst 的请求标头参数。因此,您可以在需要时从 http 标头中使用它。

【讨论】:

以上是关于如何在 Java 中调用 getsockopt 以获取 SO_ORIGINAL_DST的主要内容,如果未能解决你的问题,请参考以下文章

Linux下getsockopt/setsockopt 函数说明

为啥getsockopt optlen 为零?

getsockopt 返回与 setsockopt 中的一组不同的 IP_TOS 值

sendto的最大缓冲区长度?

getsockopt 返回负 mss(在 CLion 上)

拨打 tcp 127.0.0.1:8500:getsockopt:consul 中的连接被拒绝