如果給perl中的gethostbyname函數指定了錯誤的格式IP,會發生什麼情況?我們的一個腳本在給出錯誤的格式IP(例如1.1.1)時表現得很怪異。在調試時,發現gethostbyname在給出1.1.1時返回了一個值,例如..在我看來,......在我看來,gethostbyname應該返回undef,對吧?當給定IP時,perl gethostbyname
回答
在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'的鏈接。 請通過指定完整域名或將其封裝在代碼塊中來更正它。
這就是我的意思是「不被廣泛支持」。
oops,我的號碼不匹配。 16777127應該是16777217.它是0x01000001。哦,是的,我沒有提到gethostbyname在歷史上也允許使用八進制和十六進制數字,所以如果某個party-pooper沒有出現並禁用它,0x01000001也可以用作主機名。 –
數字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
- 1. 使用gethostbyname來解析IP
- 2. 使用gethostbyname()查找IP
- 3. 從DNS獲取IP而不使用gethostbyname?
- 4. 使用PHP的gethostbyname檢索IP地址()
- 5. 無法使用gethostbyname獲取本地IP()
- 6. Perl和的gethostbyname怪異的行爲
- 7. gethostbyname()不工作
- 8. Perl:獲取不在給定列表中的IP地址範圍
- 9. 如何使用perl cgi查找給定IP的子網?
- 10. php gethostbyname()函數
- 11. 使用gethostbyname的DNS
- 12. PHP返回gethostbyname($ lookup)值
- 13. 用gethostbyname使stream_socket_client更快?
- 14. winsock gethostbyname失敗
- 15. gethostbyname()在iOS6中失敗
- 16. gethostbyname()和valgrind
- 17. gethostbyname的替代方案
- 18. gethostbyname C++的問題
- 19. 當多個IP地址分配給PC時,如何獲取默認IP地址
- 20. Perl的主機到IP解析
- 21. gethostbyname xcode問題
- 22. gethostbyname有什麼問題?
- 23. 如何檢測您的IP /名稱使用gethostbyname()
- 24. GetHostByName錯誤與http鏈接獲取IP地址
- 25. 如何更改gethostbyname返回的IP地址列表順序?
- 26. 當壞IP提供給CURLOPT_DNS_SERVERS時,Curl返回所有ok。
- 27. gethostbyname替換爲IPv6地址
- 28. MPICH2 gethostbyname失敗
- 29. 使用gethostbyname
- 30. gethostbyname問題
順便說一句,IPv4/IPv6的兼容性透明的,你可能要被調用'插槽:: getaddrinfo'而不是IPv4的唯一遺產'gethostbyname'解析器。 – LeoNerd
感謝您的答案,Alan和LeoNerd。是的,gethostbyname在第三個八位字節中加了一個'0',因此即使用戶輸入錯誤的3字節IP,我們的腳本也會提供有效的輸出。如何解決這個問題? – user1500970
用戶輸入沒有錯誤。如果你想驗證它具有更嚴格的格式要求,那麼你應該這樣做。也許是正則表達式測試什麼的。但是這個值非常好,可以被各種地址解析函數接受,所以我不明白爲什麼它應該被拒絕。 – LeoNerd