【问题标题】:How to flush cache for socket.gethostbyname response?如何刷新 socket.gethostbyname 响应的缓存?
【发布时间】:2011-10-19 04:38:56
【问题描述】:

之前有人遇到过这个:

更新 DNS 记录后..我对 '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 中的更新地址。

【问题讨论】:

    标签: python sockets caching dns gethostbyname


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      默认情况下,DNS 在 Linux 上不缓存,需要一个守护进程,例如 sssdnscd。您可以简单地重新启动守护程序以强制拉入新地址。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        • 2023-04-10
        • 2012-04-12
        • 2015-11-28
        • 1970-01-01
        • 2021-02-16
        • 2011-11-06
        相关资源
        最近更新 更多