2017-02-27 99 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

相關問題