2017-02-27 100 views
-2
_, err := strconv.ParseInt(host, 10, 64) 
if err == nil { 
    hp.IpAddress = host   
} else {    
    hp.HostName = dbhost 
}  

随着主机= sealinuxvm11我越来越如何确定给定的字符串是主机名或IP地址

error strconv.ParseInt: parsing " sealinuxvm11 ": invalid syntax 

,并与主机= 192.168.24.10

strrconv.ParseInt: parsing " 192.168.24.10": invalid syntax 
+1

IP地址不是一个整数。 – foecum

+1

“192.168.24.10”看起来像是一个有效的整数吗? – Flimzy

回答

5

的IP地址应该被解析为一个字符串。我使用网络包的ParseIP来确定给定字符串是IP还是主机

addr := net.ParseIP(host) 
     if addr == nil { 
      hp.IPAddress = host 
     } else { 
      hp.HostName = host 
     } 

这可能会将主机名设置为无效值。如果net.ParseIP返回错误,请检查以确保主机名是有效的主机名。将使用

hostName, err := net.LookupHost(host) 
if len(hostName) > 0{ 
    if hostName[0] == hp.HostName{ 
    } 
} 

,以确定该主机名是有效的

Kosik在评论中指出的,肯定有更好更快的方式来确定主机名是有效的。我建议你做一些如何实现的研究

+2

我建议不要使用'net.LookupHost()'来进行验证:这种功能并非纯粹的:它可能具有广泛的副作用(想象在紧密循环中检查100000个主机名的有效性)。事实上,检查一个主机名是否有效很简单(逐字符迭代器与一个smlple状态机结合使用;我会说它将在100行以下的代码中)。 – kostix

+2

基本上由[RFC 952](https://tools.ietf.org/html/rfc952)定义并由[RFC 1123](https://tools.ietf.org/html/rfc1123#page- 13),这使定义有点松散。前者为主机名定义以下语法:' :: = * [“。” ]'和' :: = [* [] ]加上支持主机名长度从63到255个字节的长度要求。我会说实现上述两个规则的解析器并不难。 – kostix

相关问题