0

由于我的 Linksys 路由器没有为计算机(PC、Mac 和 Linux)分配固定的本地 IP,我想编写一个脚本,以便每分钟,计算机将相互更新,以便

http://localhost/list.html

每台机器上将包含所有 PC 和 Mac 的名称列表以及指向其 apache 服务器的链接(指向http://192.168.1.102等)

它看起来像是一种找出本地 IP 地址的方法是在 PC 上通过 ipconfig,在 Mac 和 Linux 上通过 ifconfig,并且以编程方式进行,它将是 gethostbyname()。

但我试过 Ruby,那个

irb(main):001:0> require 'socket'
=> true

irb(main):002:0> p Socket::gethostbyname("localhost")
["Core2Duo", [], 2, "\177\000\000\001"]

irb(main):005:0> p Socket::gethostbyname("core2duo")
["Core2Duo", [], 2, "\300\250\001g"]
=> nil

和 ipconfig 实际上显示

IPv4 Address. . . . . . . . . . . : 192.168.1.103

那么这是正确的方法吗?我可以通过在 Ruby 中执行“ipconfig”来破解它,并使用正则表达式来获取结果,但使用更标准的方式会很好。

4

6 回答 6

2

Socket::getaddrinfo可能是您正在寻找的更多内容:

Socket::getaddrinfo('localhost', 'http')
[["AF_INET", 80, "localhost", "127.0.0.1", ...]]

Socket::getaddrinfo('core2duo', 'http')
[["AF_INET", 80, "Core2Duo", "192.168.1.103", ...]]

或者,您可以尝试:

Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"
于 2009-05-13T17:54:14.963 回答
1

您可以使用以下方法在 Java 中执行此操作:

Socket s = new Socket();
s.getLocalSocketAddress();
于 2009-05-13T17:50:01.490 回答
1

如果您在 Windows 系统上运行 Bonjour 并在 Linux 系统上运行 avahi,则无需确定每个系统的 IP 地址。然后,您可以使用“ hostname.local”简单地寻址每个系统。更多信息在这里

于 2009-05-13T18:03:25.243 回答
1

为什么不直接为这些机器关闭 DHCP 并为其分配固定 IP 地址?

编辑回应评论:至少三年前(我上次购买路由器),Linksys路由器允许您为内置DHCP服务器设置底部IP地址。然后,您进入各个机器的网络设置,禁用 DHCP,并分配物理地址。例如,在我的家庭网络上,路由器是 192.168.1.1,Terastation 是 1.2,打印机是 1.3,我的 Linux 机器是 1.99,路由器配置为 1.100 及以上。

于 2009-05-13T18:17:26.080 回答
0

Ruby 脚本中的问题可能是您的网络上没有 DNS 名称解析,如果您通常在具有 SMB/CIFS 的计算机之间共享内容,这通常是隐藏的,因为它有自己的名称发现协议。

于 2009-05-13T17:55:43.510 回答
0

如果您要广播带有名称/IP 信息的数据报,那么您实际上并不需要 PC 知道它自己的 IP 地址。只需发送包含其名称的数据报,然后使用recvfrom() - 或等效项 - 在其他 PC 上捕获它。这样,接收者可以直接通过recvfrom()函数提取发送者的 IP 地址。

作为奖励,这应该适用于发送 PC 具有多个网络适配器的情况。

于 2009-05-13T18:36:30.010 回答