如何刷新socket.gethostbyname响应的缓存?

时间:2011-08-03 14:48:00

标签: python sockets caching dns gethostbyname

之前有人碰到过这个:

更新DNS记录后..我在挖掘'test.somedomain.com'我得到167.69.143.234,但是当我执行socket.gethostbyname('test.somedomain.com')时,我得到167.69.6.234。

我猜套接字仍在使用缓存...如何清除它?或冲洗它?

我的代码非常简单:

Linux Termianl

dig test.somedomain.com

的Python:

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

它应该返回167.69.143.234地址,因为它是DNS中的更新地址。

2 个答案:

答案 0 :(得分:6)

Python socket.gethostbyname使用操作系统解析程序,没有用于清除缓存的API。缓存(可能是操作系统或操作系统或标准库组件使用的缓存DNS服务器)是DNS系统的基本元素,应对它的“正确方法”是等到记录的TTL值到期(操作系统应该从缓存中删除陈旧值)。更新DNS时,您应该具有之前调整的旧值的TTL。

你也可以使用Python DNS实现,比如DNSPython而不是socket.gethostbyname - 你应该完全控制解析器缓存(但不是解析器使用的NS的缓存)。虽然,它可能不会解决您的问题(我想现有的代码)。

答案 1 :(得分:3)

默认情况下,DNS不会缓存在Linux上,并且需要一个守护程序,例如sssdnscd。您只需重新启动守护程序即可强行拉入新地址。

Windows用户注意:有一个默认缓存可以使用ipconfig /flushdns清除。

或者,您可能在/etc/hosts中有一个硬编码条目,请先检查。 dignslookup等工具将直接查询DNS服务器并绕过NSS库子系统。

相关问题