从版本8开始,FreeBSD支持IP_BINDANY套接字选项,手册页将其定义为:
如果IP_BINDANY选项在SOCK_STREAM、SOCK_DGRAM或SOCK_RAW套接字上启用,则可以将(2)绑定到任何地址,甚至不绑定到系统中的任何可用网络接口。此功能(结合特殊的防火墙规则)可用于实现透明代理。设置此选项需要PRIV_NETINET_BINDANY权限。
是否有可能编写一个可以使用此功能的Java程序?我已经检查了SocketOptions的文档,它显然没有列出这个选项。有什么解决办法吗?
至于说到,
拉杰
发布于 2011-05-28 12:17:33
是否有可能编写一个可以使用此功能的Java程序?
使用纯Java是不可能的。
有什么解决办法吗?
有几个基于JNA/JNI的库用于从Java程序进行Posix系统调用;有关详细信息,请参见以下问题/答案:
我不知道这些在FreeBSD上是否适用于Java。
经过进一步的思考,可能可以用纯Java (虽然一定是不可移植的)Java来实现这一点。这需要创建SocketImpl和/或DatagramSocketImpl的子类以及使用它们所需的基础结构。会很复杂的。
发布于 2015-03-15 15:33:44
我在JNA中编写了一个库,可以合理地移植setsockopt位。你可以找到它,这里。
但是,要改变bind行为,您可能需要深入研究套接字代码。有关原因,请参见这里,特别是以下部分:
所以我们只需要创建一个新的
java.net.Socket对象,调用setsockopt(),最后在套接字上调用bind()-轻松,对吗?不幸的是,这并不是很简单--在Java中创建一个新的套接字对象(在OpenJDK和Oracle中)实际上并没有分配文件描述符。相反,文件描述符是在Java的bind()函数本身内分配的,这使得在适当的时候调用setsockopt()变得相当困难。
作者提出了一个相当复杂的解决办法--不过,我不打算在这里复制他的整篇文章。
https://stackoverflow.com/questions/6161437
复制相似问题