首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java程序中的setsockopt

Java程序中的setsockopt
EN

Stack Overflow用户
提问于 2011-05-28 11:45:07
回答 2查看 4.5K关注 0票数 4

从版本8开始,FreeBSD支持IP_BINDANY套接字选项,手册页将其定义为:

如果IP_BINDANY选项在SOCK_STREAM、SOCK_DGRAM或SOCK_RAW套接字上启用,则可以将(2)绑定到任何地址,甚至不绑定到系统中的任何可用网络接口。此功能(结合特殊的防火墙规则)可用于实现透明代理。设置此选项需要PRIV_NETINET_BINDANY权限。

是否有可能编写一个可以使用此功能的Java程序?我已经检查了SocketOptions的文档,它显然没有列出这个选项。有什么解决办法吗?

至于说到,

拉杰

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-28 12:17:33

是否有可能编写一个可以使用此功能的Java程序?

使用纯Java是不可能的。

有什么解决办法吗?

有几个基于JNA/JNI的库用于从Java程序进行Posix系统调用;有关详细信息,请参见以下问题/答案:

我不知道这些在FreeBSD上是否适用于Java。

经过进一步的思考,可能可以用纯Java (虽然一定是不可移植的)Java来实现这一点。这需要创建SocketImpl和/或DatagramSocketImpl的子类以及使用它们所需的基础结构。会很复杂的。

票数 1
EN

Stack Overflow用户

发布于 2015-03-15 15:33:44

我在JNA中编写了一个库,可以合理地移植setsockopt位。你可以找到它,这里

但是,要改变bind行为,您可能需要深入研究套接字代码。有关原因,请参见这里,特别是以下部分:

所以我们只需要创建一个新的java.net.Socket对象,调用setsockopt(),最后在套接字上调用bind() -轻松,对吗?不幸的是,这并不是很简单--在Java中创建一个新的套接字对象(在OpenJDK和Oracle中)实际上并没有分配文件描述符。相反,文件描述符是在Java的bind()函数本身内分配的,这使得在适当的时候调用setsockopt()变得相当困难。

作者提出了一个相当复杂的解决办法--不过,我不打算在这里复制他的整篇文章。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6161437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档