为啥 IPAddress.TryParse 允许“]”之后的任何内容
Posted
技术标签:
【中文标题】为啥 IPAddress.TryParse 允许“]”之后的任何内容【英文标题】:Why does IPAddress.TryParse allow anything after a ']'为什么 IPAddress.TryParse 允许“]”之后的任何内容 【发布时间】:2010-05-14 16:11:05 【问题描述】:我想使用 System.Net.IPAddress.TryParse 来验证 IPv6 地址,因为我不想编写自己的 reg exp :-)
但是,这似乎允许诸如“(validIPv6)](anythingatallhere)”之类的字符串 - 例如,“1234::5678:abcd]whargarbl”。
这些是否有效,或者这是一个错误?
由于我实际上只想要“[(validIPv6)]:(portnumber)”形式的字符串,因此我必须自己进行一些验证。
【问题讨论】:
System.Net.IPAddress.Parse("1234::5678:abcd]whargarbl") 对我来说失败了。请记住,当使用 try parse 时,它不会抛出 except 而是将 out 参数保留为默认值 什么版本的 Windows? used2could:该字符串为我传递 - TryParse 返回 True,并且 IPAddress 具有例如AddressFamily 设置为 InterNetworkV6 和 ToString() 值“1234:0000:0000:0000:0000:0000:86.120.171.205”。 SLaks - 这是 XP,我猜它实际上并不支持 IPv6。 【参考方案1】:我正在查看反射器,似乎如果您当前的操作系统不支持 IPV6,则会调用一个解析例程,该例程将忽略最后一个 ']'
字符之后的所有内容。
这似乎是有问题的代码,请注意第二个或条件,因为它与前面的代码位相关。
int length = ipString.Length;
fixed (char* str2 = ((char*) ipString))
char* name = str2;
if (IPv6AddressHelper.IsValid(name, start, ref length) || (length != ipString.Length))
【讨论】:
你能多发一点吗?我实在想不通。或者你不认为其余的会有帮助吗?看起来 IsValid 要么改变 ipString(通过 str2 和名称)或长度......所以如果整个字符串有效则返回 true,或者如果子字符串有效则改变字符串/长度? @Rawling - 你的理论与我收集到的相似,所以发布更多代码可能不会有什么不同,反正代码太多了。 这里也引用了:social.msdn.microsoft.com/Forums/en/ncl/thread/… 所以基本上,它有点坏了。意识到我实际上不需要使用正则表达式后,我很想编写自己的验证代码,要么自己处理方括号并将其余部分传递给库,要么只使用 Split 等来验证它完全是我自己。以上是关于为啥 IPAddress.TryParse 允许“]”之后的任何内容的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?