1

我目前正在为大学更新一个项目。有问题的程序访问 IP 地址并确定 IP 是否托管网站。该系统的目标是确定网络的大小(分布在可用系统中,上次运行耗时 2.5 个月)。

当前的目标是尝试减少为 IP 做出准确决策所需的时间,但我无法改进这一点。目前,以下是主要的测试来源(当然还有额外的逻辑):

Socket s = new Socket();
s.connect(new InetSocketAddress(address, 80), timeout);

我主要寻求/寻求帮助的是,是否有更快的方法来确定 IP 是否托管网站,同时保持准确。当前系统使用 30 秒的超时值,因此大量 IP 地址检查需要这 30 秒,因为许多 IP 不托管网站。任何指向 Java 库或算法论文的帮助将不胜感激。

谢谢。

4

4 回答 4

0

当然,您是在并行执行此操作,即在尝试另一个套接字之前不阻塞 30 秒?

您可以同时打开的套接字数量是有限制的,但您应该能够同时打开至少 100 个。

于 2012-05-30T14:53:16.397 回答
0

确定主机是否愿意在给定端口上为您提供网页的唯一可靠方法是请求它,这总是会导致打开 TCP 套接字并发送 HTTP GET-Request。但是,您可以使用 NMAP http://nmap.org/中的技术(和 c 库)来有效地检测 :80 处是否存在 TCP-Endpoint。当然,您可以调整您的程序以同时检查数千个主机,每个公共 IP ...

但是请注意,您的整个方法只能在端口 80 上提供非常模糊的网络服务器数量,仅此而已。每个 http 主机还有其他端口、加密 (SSL) 和多个网站会影响您的测量。并且不要忘记有 IPv4 和 IPv6。

于 2012-05-30T15:01:28.527 回答
0

正如昨天建议的那样,Nmap 绝对是一个不错的选择。如果您选择走这条路,sourceforge.net 上有一个名为 Nmap4j 的 Java 包装库,它应该可以更容易地集成到 Java 程序中。

干杯!

于 2012-05-31T16:47:46.467 回答
-2

这里是所有端口的列表:

http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers  

我做的第一件事是限制端口搜索范围。
然后我尝试使用“正常”端口(80、8080、443,...)。等待秒数无法限制。

于 2012-05-30T15:06:06.477 回答