【问题标题】:Validate a user-entered IP address or hostname via C#通过 C# 验证用户输入的 IP 地址或主机名
【发布时间】:2010-06-17 12:36:57
【问题描述】:

在我的 Windows 窗体应用程序的几个字段中,我要求用户提供 IP 地址或主机名。是否有一个好的正则表达式(正则表达式)来验证输入的值?还是我应该考虑另一种方法?请注意,我希望用户输入 FQDN 或 IP 地址。

【问题讨论】:

  • 如果您希望此应用程序能够持续使用,请不要忘记考虑 IPv6 地址的含义。
  • jjnguy - 无意转发。如果我这样做了,我会检查一下并道歉。 Dave - 我自己一直在研究这方面,并意识到我目前可能在我的应用程序中走错了路,因为它目前仅基于 IPv4。我对此非常担心。
  • 添加了“或者我应该考虑其他方法吗?”因为您接受非正则表达式方法。这也使这个问题不会被标记为duplicate

标签: c# regex winforms data-entry


【解决方案1】:

为了让您的应用程序适应未来的发展,我建议只使用IPAddress.TryParse() 来确定输入是否为 IP 地址。

检查“有效”主机名更加困难,这也是因为您没有指定主机名是否必须存在。如果是这样,最简单的方法是使用Dns.GetHostEntry() 来查看是否会产生结果。根据您提供的描述,您无法获得更准确的验证。

【讨论】:

  • 如果用户输入主机然后单击按钮来验证主机条目,那么 Dns.GetHostEntry() 是否有用...例如 Active Directory 相关字段上的检查名称按钮?跨度>
  • 当然,我已经在多个工具中看到过这种情况,首先想到的是 IIS SMTP 服务器配置(在设置服务器的 FQDN 时)。
  • 请参阅IPAddress.AddressFamily 以区分 IPv4 和 IPv6 地址。另见this answer
【解决方案2】:

尝试拨打IPAddress.TryParse,如果失败尝试拨打Dns.GetHostByName

【讨论】:

    【解决方案3】:

    为什么您需要询问 Windows 窗体应用程序的 IP 地址和主机名?如果这些是本地 PC 详细信息,您可以从以下位置获取这些信息:-

    1) 要获取主机名,您可以调用 Dns.GetHostName()(参见MSDN reference

    2)要获取IP地址,可以通过Dns.GetHostByName()枚举IP地址(见MSDN reference

    【讨论】:

    • 数据不会用于在本地系统上进行测试。它将用于确定 SSH 服务器是否存在以及用户输入的数据是否真实(如 blahblahblah == 错误,66.234.34.23 == 正确)。这个问题完全是在处理远程主机。
    • @ThaKidd,感谢您的澄清。请注意,我认为您仍然可以使用 Dns.GetHostByName(hostname) 来验证主机名是否有效。 IP 地址同上,您可以使用 Dns.GetHostByAddress() 来检查地址。
    • Dns.GetHostByName 和 Dns.GetHostByAddress 都已被标记为过时。
    【解决方案4】:

    如果你想验证格式是否有效,你可以使用

    bool isValid = Uri.CheckHostName(hostname) == UriHostNameType.Dns;
    

    而不是正则表达式,这可能容易出错。我在预配置应用程序中使用它,用户可以在其中指定将在 future 中设置的主机名。为此,Dns.GetHostEntry 不适合,因为它尝试解析主机名,但由于尚未分配,因此将失败。

    所以这取决于您的需求。如果用户应该输入一个实际上可以解析的主机名,您可能需要使用Dns.GetHostEntry() or IPAddress.TryParse()。如果您只想进行输入验证,请尝试Uri.CheckHostName

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2015-04-29
      • 2011-09-15
      相关资源
      最近更新 更多