有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

检测*NIX上打开的端口时出现java问题

我正在尝试编写一个程序,在系统的所有接口上检测多种UNIX和Linux版本的开放端口。通过对这个网站和其他网站的研究,我找到了类似的代码:

try {
    SocketServer s = new SocketServer(port, 0, host).close();
} catch ( Exception ex ) {
    do something here...
}

类似于:

DatagramSocket d = new DatagramSocket(port, host).close();

代码在RHEL 6上运行得很好。但是,在AIX 7、HP-UX 11.31和Solaris 10和11上,未检测到一些打开的端口。例如,代码没有报告SSH(TCP 22)打开,每个系统上都有一个SSH守护进程(这就是我连接到系统的方式)。但SSH守护进程并不是唯一一个未报告的开放端口

我在一篇帖子中看到一条评论,指出在Java 7及更高版本上使用SocketServer似乎效果不佳,并建议将代码转换为客户端socket连接:

Socket s = new Socket(host, port);

这段代码工作得更好,但速度要慢得多(因为在关闭/不活动的端口上等待连接)。它也不是100%准确。(我可以理解这种情况,即一个程序声明了一个端口,但不接受该端口上的连接。)

我应该注意,我使用netstat输出作为比较基础。例如,在Linux上:

# netstat --protocol=inet -aln

其他人的情况也类似:

# netstat -f inet -an

我很想使用Java的原生网络来解决这个问题,因为它应该可以跨所有目标平台工作。但我还没有找到一个在所有平台上都100%有效的解决方案

所以,我的问题。以前有没有人经历过这种情况,并找到了一种跨多个平台工作的方法?如果是这样,你能告诉我它的方向吗

谢谢

约翰

更新日期:2015年5月5日

发现了一些额外的信息(多亏了一位同事发现了很多这方面的信息)

1)我运行的所有系统(RHEL 6系统除外)都有双栈(IPv4和IPv6)。控制这一点的JVM网络属性是java。网preferIPv4Stack属性。可以在Oracle文档here中找到解释

2)SO_REUSEADDR和SO_REUSEPORTsocket选项也可能涉及一些交互。上面有一个很好的StackOverflow线程here

3)最后,JDK中的一个错误已经解决。该漏洞只提到Windows 7和2008。我把它放在这里作为参考,以防有人偶然发现这条线索。链接是here

j


共 (0) 个答案