2011-08-03 117 views
5

人遇到此之前:如何刷新socket.gethostbyname響應的緩存?

更新DNS records..I做「test.somedomain.com」我得到167.69.143.234,但是當我做了socket.gethostbyname('test.somedomain冷嘲熱諷之後。 com')我得到167.69.6.234。

我猜套接字仍在使用緩存......我該如何清除它?或沖洗它?

我的代碼是非常簡單的:

的Linux吡嗪酰胺

dig test.somedomain.com 

的Python:

import socket 
socket.gethostbyname('test.somedomain.com') 

應該返回167.69.143.234地址是在DNS更新的一個。

回答

6

Python的socket.gethostbyname使用操作系統解析器,並且沒有用於清除其緩存的API。緩存(可能是操作系統或操作系統或標準庫組件使用的高速緩存DNS服務器)是DNS系統的基本組成部分,應對它的「正確方法」是等待記錄的TTL值到期(操作系統應該從緩存中刪除陳舊的值)。在更新DNS時,您應該早些時候調整舊值的TTL。

您也可以使用Python DNS實現,如DNSPython而不是使用socket.gethostbyname - 那麼您應該完全控制解析器緩存(但不是解析器使用的NS的緩存)。雖然,它不會解決你的問題(我想是用現有的代碼)。

2

默認情況下,DNS不在Linux上高速緩存,並且需要守護進程,如sssdnscd。您可以簡單地重新啓動守護程序以強制拉入新地址。

Windows用戶注意事項:有一個默認緩存可以用ipconfig /flushdns清除。

或者,您可能在/etc/hosts中有硬編碼條目,請先在那裏檢查。像或nslookup這樣的工具將直接查詢DNS服務器並繞過NSS庫子系統。