2012-07-04 67 views
1

如果給perl中的gethostbyname函數指定了錯誤的格式IP,會發生什麼情況?我們的一個腳本在給出錯誤的格式IP(例如1.1.1)時表現得很怪異。在調試時,發現gethostbyname在給出1.1.1時返回了一個值,例如..在我看來,......在我看來,gethostbyname應該返回undef,對吧?當給定IP時,perl gethostbyname

+2

順便說一句,IPv4/IPv6的兼容性透明的,你可能要被調用'插槽:: getaddrinfo'而不是IPv4的唯一遺產'gethostbyname'解析器。 – LeoNerd

+0

感謝您的答案,Alan和LeoNerd。是的,gethostbyname在第三個八位字節中加了一個'0',因此即使用戶輸入錯誤的3字節IP,我們的腳本也會提供有效的輸出。如何解決這個問題? – user1500970

+0

用戶輸入沒有錯誤。如果你想驗證它具有更嚴格的格式要求,那麼你應該這樣做。也許是正則表達式測試什麼的。但是這個值非常好,可以被各種地址解析函數接受,所以我不明白爲什麼它應該被拒絕。 – LeoNerd

回答

3

在IPv4中的開始,CIDR之前,地址被認爲是由網絡部分和主機部分。這些部分可以獨立寫成點分十進制形式,並且不需要完全分解爲字節。所以1.1是網絡上的主機1 1,相當於1.0.0.1或者你也可以把它寫作爲一個大的32位數字:16777217.曾幾何時,人們使用的URL喜歡http://16777127/表明他們多麼聰明人的時間。當垃圾郵件發送者開始欺騙過濾器時,垃圾郵件被破壞了。

不知怎的,當我平安1.1.1,它進入1.1.0.1。我會猜到1.0.1.1。我不確定究竟是什麼規則來決定它是如何分解的。

這些舊形式不廣泛的支持(甚至明白)了,但他們還沒有完全從所有的工具和庫拔出來。

P.S.在我第一次嘗試提交此答案時,stackoverflow說:

您的文章包含無效域名'16777127'的鏈接。 請通過指定完整域名或將其封裝在代碼塊中來更正它。

這就是我的意思是「不被廣泛支持」。

+0

oops,我的號碼不匹配。 16777127應該是16777217.它是0x01000001。哦,是的,我沒有提到gethostbyname在歷史上也允許使用八進制和十六進制數字,所以如果某個party-pooper沒有出現並禁用它,0x01000001也可以用作主機名。 –

2

數字IPv4地址可以被寫爲1,2,3或4個數字組成。每個非最終分量表示8位(1個八位字節),最後表示提供完整32位地址所需的位數。因此,以下全部表示本地環回地址:

2130706433 
127.1 
127.0.1 
127.0.0.1 

每個組件本身可能會寫成十進制,十六進制或八進制;因此,以下所有也編碼相同的地址

0x7f000001 
127.0x01 
0177.0.1 
0x7f.0.0.1