因为我的Linksys路由器不分配一个固定的本地IP的电脑(PC和Mac和Linux),我想编写一个脚本,使每一分钟,计算机将更新到对方,这样

HTTP://localhost/list.html

在每台机器上都会包含所有的PC和Mac以及他们的Apache服务器的链接(指向 HTTP的名称的列表:/ /192.168.1.102 等)

它看起来像一个办法,找出本地IP地址是由ipconfig在PC上,并使用ifconfig在Mac和Linux上,并以编程方式做到这一点,它会调用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”破解它,并使用正则表达式来得到结果,但将是很好的使用更标准的方式来做到这一点。

有帮助吗?

解决方案

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"

其他提示

您可以使用Java中做到这一点:

Socket s = new Socket();
s.getLocalSocketAddress();

如果您在Linux系统上的Windows系统和运行的avahi卓悦,你可以不设,需要确定每个系统的IP地址。然后,您可以简单地解决使用“hostname.local”每个系统。更多信息这里

为什么不干脆关闭DHCP这些机器,并将它们分配固定的IP地址?

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

在Ruby脚本的问题可能是存在网络上没有DNS域名解析,这往往隐藏,如果你平时分享SMB / CIFS计算机之间的东西,因为这有它自己的名字发现协议。

如果您将要广播数据报的名/ IP信息,那么你并不真的需要一台PC要知道自己的IP地址。只是发送包含它的名字的数据报,那么使用 recvfrom的() - 或等同物 - 捕获它在其它PC。这种方式,接收器可以通过在 recvfrom的()功能直接提取发送者的IP地址。

作为奖励,应该工作,其中所述发送PC有一个以上的网络适配器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top