如何使用java获取连接到LAN的所有系统名称?

时间:2009-10-24 12:54:54

标签: java networking

我想让所有系统连接到局域网? 谁能建议我?

3 个答案:

答案 0 :(得分:2)

我在Java中用来实现这个目的的包称为jcifs。以下是 Library 的链接。

请注意,要识别子网上的计算机,您需要ping子网上所有可用的IP地址。从那里,您可以执行反向IP地址查找以获取计算机详细信息。

从OSI的内存中,您想要ping网络上所有计算机的原因是因为ICMP仍然是OSI模型中的最低层。虽然您只是不相信对子网上的所有计算机使用ICMP(ping)请求。这样做的原因是大多数Windows机器防止钓鱼攻击会阻止该协议。因此,您需要采用两阶段检测方法。首先,使用ICMP ping请求通过SubNet IP地址进行广播。等待1秒后,从ICMP ping请求继续执行与非响应IP地址的SMB连接。你会发现大多数人都会有一个Microsoft Network的共享打印机,它将响应该端口下的请求。

另一种方法是使用NetBios反向名称查找,但它仍然涉及垃圾邮件子网的IP地址范围。

希望这有帮助。

答案 1 :(得分:0)

为什么你想要它们,为什么它们必须是名字?并非所有系统都有名称。

您想要枚举哪种系统?

如果您尝试查找自己应用程序的附近实例,请使用多播UDP创建发现协议。

如果您正在尝试找到某个具有自己协议的服务器,那么请使用它。

答案 2 :(得分:0)

如果我打算尝试在Java中实现这一点,我会选择一些未使用的TCP / IP端口号,然后尝试在LAN的IP地址范围内为每个IP地址打开一个套接字。您希望所有连接尝试都失败,但它们应以不同方式失败,具体取决于计算机是否使用IP地址。如果正在使用IP地址,则应该“拒绝连接”。如果它没有被使用,你应该得到“无主机路由”或“没有网络路由”。 “连接超时”可能表示主机是防火墙,或者是最近还活着,但目前还没有活着。

另一种方法(我不知道你可以用Java做)是为网络地址范围内的每个IP地址发送ARP请求,看看机器的ARP缓存中出现了什么。

当然,您可以尝试发送ICMP Ping消息,但它们可能是防火墙。

获得实时IP地址列表后,使用DNS反向查找查找相应的DNS名称。但请注意,并非所有IP地址都绑定到DNS名称。

然而,鉴于很多机器和网络都使用各种防火墙,这些都不会丢弃网络消息或发送误导性的响应,这一点都有点脆弱。