将主机名解析为 IP 地址
Posted
技术标签:
【中文标题】将主机名解析为 IP 地址【英文标题】:Resolve host name to an ip address 【发布时间】:2011-03-12 04:59:04 【问题描述】:我开发了一个客户端/服务器模拟应用程序。我在两台不同的 Windows XP 机器上部署了客户端和服务器。不知何故,客户端无法向服务器发送请求。
我尝试了以下选项:
使用 ip-address 从客户端成功 Ping 服务器计算机。
使用 ip-address 从服务器成功 Ping 客户端计算机。
检查了两台机器上的 netstat 命令行工具。服务器处于LISTENING
模式,客户端处于SYS_SENT
模式。但是它用来发送的外部地址是主机名而不是 IP 地址。
使用来自客户端的主机名 Pinged 服务器计算机失败。
使用来自服务器的主机名成功 Ping 客户端计算机。
我觉得问题出在客户端尝试使用主机名连接到服务器时。
您能否告诉我如何强制应用程序使用 IP 地址而不是主机名?有没有其他方法可以将主机名映射到 IP 地址?
【问题讨论】:
你用的是什么库? inet_addr 可能对您有用吗? msdn.microsoft.com/en-us/library/ms738563(VS.85).aspx 【参考方案1】:转到您的客户端计算机并输入:
nslookup server.company.com
当然,用你的服务器的真实主机名替换server.company.com
。
这应该告诉您您的客户端正在使用哪个 DNS 服务器(如果有)以及它认为问题出在名称上。
强制应用程序使用 IP 地址,通常您只需将其配置为使用 IP 地址而不是主机名。如果主机名是硬编码的,或者应用程序坚持使用主机名而不是 IP 地址(正如您的其他 cmets 之一似乎表明的那样),那么您可能在这方面不走运。
但是,您可以更改大多数机器解析主机名的方式,例如在 UNIX 系统上使用 /etc/resolv.conf
和 /etc/hosts
,在 Windows 系统上使用 a local hosts file。
【讨论】:
我在客户端和服务器上都尝试了 nslookup。客户端:----------------- nslookup client-pc 服务器:ns.murphx.net 地址:62.69.62.6 ** ns.murphx.net 找不到 acf-pc:不存在的域。当我执行 nslookup server-pc 时的响应相同。服务器: --------- nslookup client-pc *** 默认服务器不可用。服务器:未知地址:127.0.0.1 nslookup server-pc *** 默认服务器不可用。服务器:未知地址:127.0.0.1 DNS 请求超时。超时为 2 秒。 ***请求未知超时。我做 nslookup server-pc 时的响应相同。 您的服务器似乎将自己用作 DNS 服务器(但从外观上看并未运行 DNS 服务)。它可能在其本地主机文件中包含客户端详细信息。另一方面,您的客户端配置为使用 ns.murphx.net 作为 DNS 服务器,但该服务器不知道 acf-pc。您需要理清您的 DNS 服务器应该在哪里,配置机器以使用它们,并确保您的所有机器都在该 DNS 中注册。或者,为了进行测试,请按照我提供的关于如何设置本地 DNS 转换的链接进行操作,以便不需要 DNS 服务器。【参考方案2】:尝试使用 tracert 解析主机名。 IE 你有 IP 地址 8.8.8.8 所以你会使用;跟踪 8.8.8.8
【讨论】:
这也适用于反向。 IE,你使用tracert facebook.com 获取Facebook服务器的IP。【参考方案3】:您可以使用 C 函数 getaddrinfo() 来获取数字地址 - ipv4 和 ipv6。 见示例代码here
【讨论】:
链接好像失效了,但至少你还可以通过archive.orghere得到它。您可能需要考虑在答案中包含一些源代码。【参考方案4】:如果没有更多关于网络架构的详细信息,这很难回答。一些需要调查的事情是:
客户端和/或服务器是否可能位于 NAT 设备、防火墙或类似设备的后面? 是否有任何 IP 地址涉及“本地”地址,例如 192.168.x.y 或 10.x.y.z? 什么是主机名,它们是“真正的”DNS:able 名称还是更本地和/或特定于 Windows 的名称? 客户端如何查找服务器?代码或配置数据中必须有一个位置保存主机名,如果您想避免查找,只需尝试使用那里的 IP。【讨论】:
感谢您的回复。 IP 地址是本地的,它们以 192.168.x.y 开头。 DNS 名称对机器来说更本地化。我正在为应用程序提供 IP 地址,但不知何故,它在向服务器发送数据时使用了主机名(使用 netstat 外部地址识别)。【参考方案5】:Windows XP 具有 Windows 防火墙,如果配置不正确,可能会干扰网络流量。如果您具有管理员权限,则可以通过控制面板访问 Windows 防火墙小程序来关闭 Windows 防火墙。如果您的应用程序在 Windows 防火墙关闭的情况下工作,那么问题可能是由于防火墙的设置造成的。
我们有一个应用程序可以在使用 UDP/IP 通信的多台 PC 上运行,我们一直在进行实验,以便该应用程序可以在没有管理员权限的用户的 PC 上运行。为了让我们的应用程序在多台 PC 之间进行通信,我们必须使用管理员帐户来修改 Windows 防火墙设置。
在我们的应用程序中,一台 PC 被指定为服务器,其他 PC 是服务器/客户端组中的客户端,同一子网上可能有多个组。
第一个更改是使用 Windows 防火墙小程序的“例外”选项卡的功能为我们用于通信的端口创建例外。
我们正在使用主机名查找,以便客户端可以通过使用由助记符前缀和破折号后跟分配的终端号(例如 SERVER100-1)组成的计算机名称来定位其分配的服务器。这允许多个服务器及其分配的客户端在同一子网上共存。客户端使用其前缀为分配的服务器生成计算机名称,然后使用主机名查找来发现分配的服务器的 IP 地址。
我们发现,除非服务器 PC 的 Windows 防火墙启用了文件和打印机共享服务端口,否则使用计算机名称(通过“系统属性”对话框的“计算机名称”选项卡分配)的主机名查找将不起作用。
因此我们必须进行两项更改:(1) 为我们用于通信的端口设置一个例外,(2) 在“例外”选项卡中启用文件和打印机服务以允许查找主机名。
** 编辑 **
你也可以找到这个Microsoft Knowledge Base article on helpful on Windows XP networking。
看看这个article on NETBios name resolution in Windows。
【讨论】:
以上是关于将主机名解析为 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章