【问题标题】:IP address + sub net mask validationIP 地址 + 子网掩码验证
【发布时间】:2015-10-18 12:05:07
【问题描述】:

在我的应用程序中,用户输入 ip 地址 + 子网掩码,如下所示: 192.168.0.0/16 或 80.80.80.0/24 我想像这样验证它:

  1. 如果 ip 地址不是有效地址,则返回 false。(它简单且 我可以用IPAddress.TryParse 方法做到这一点)
  2. 如果IP地址不是公共地址则返回 假。(192.168.0.0/16=假)
  3. 如果子网掩码无效。(不在 0 到 32 之间)。

我是 C# 新手,如果您能告诉我验证 IP 地址的最佳方法,我将不胜感激。 谢谢。

【问题讨论】:

  • 您可以使用正则表达式。看这篇文章blog.markhatton.co.uk/2011/03/15/…
  • 谢谢。但我不喜欢使用正则表达式。
  • 在这种情况下,简单的字符串拆分不需要正则表达式。我会先围绕“/”拆分,然后围绕句点拆分。
  • 您真的接受子网掩码 0 吗?这实际上意味着“整个 IPv4 互联网,包括私有地址范围”。
  • 其实是的。这意味着所有IP地址都可以访问Web服务。

标签: c#


【解决方案1】:

检查字符串是否包含“:”, //这是IPv6

如果字符串以fd开头,则返回false

其他: 您可以使用“。”上的拆分​​来解析字符串。 //这是针对IPv4的 1. 如果以 10. 开头,则返回 false 2.如果以 172.16 开头,子网为 12 ,则返回 false 3. 如果以 192.168 开头,子网为 16,则返回 false

最后,拆分 / 并查看第二部分并解析 Integer。如果不在0到32的范围内,则返回false

【讨论】:

  • 如果人们继续为 IPv4 编写代码,IPv6 永远不会起飞。
  • 这里的问题是针对 IPv4 的
  • 问题是IP地址。他没有在任何地方说“我不希望这段代码在我们过渡到 IPv6 时继续工作”
  • 合并了 IPv6 的更改
【解决方案2】:

请尝试进行一些搜索,因为您的问题可能已经回答过。

Q1请参考this stackoverflow article

对于 Q2 和 Q3,拆分输入字符串后可以轻松检查(如@RPradeep 的答案)

毕竟,我建议你找一个更好的 3rd 方“C# IP 地址库”。我认为您的要求是常见用法,以前可能有人会这样做。比你自己再做一次要好,对吧?

更新

对于第二季度,仍有a stackoverflow article 可以帮助您。

更新

根据您的评论,我为您推荐另一种方法 - 列出您想要返回 false 的所有 IP 地址,并检查是否可以在列表中找到目标 IP 地址?

对于 IPv4,有一个 codeproject article 可以为您构建 IP 地址列表 - 以简单的方式。

【讨论】:

  • 谢谢。但我已经搜索过,不幸的是找不到任何东西。如果您知道 dll 或任何可能有帮助的东西,我真的很感激让我知道。
  • 我可以提供我所知道的给你,但我建议你练习你的 google-fu,真诚 :) 请看我更新的答案。
  • 谢谢。我已经看过这篇文章了。不幸的是,它没有发生。例如 169.254.0.0/16 不是有效的 IP 地址范围。
  • @Dan 好的,所以你想检查一下en.wikipedia.org/wiki/IPv4#Special-use_addresses 中列出的那些保留 IP 地址吗?我找到了另一种方法,请查看我的最新更新。
  • 非常感谢。但我想我找到了更好的东西:link。你怎么看?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2015-05-29
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多