Как очистить кэш для сокета.ответ функция gethostbyname?

кто-нибудь столкнется с этим раньше:

после обновления записей DNS..Я копаю для ...test.somedomain.com " я получаю 167.69.143.234, однако, когда я делаю сокет.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 ответов


в Python socket.gethostbyname использует распознаватель операционной системы и не имеет API для очистки кэша. Кэш (который может быть кэширующим DNS-сервером, используемым операционной системой или операционной системой или стандартным библиотечным компонентом) является фундаментальным элементом системы DNS, и "правильный способ" справиться с ним-подождать, пока не истечет значение TTL записи (операционная система должна удалить устаревшее значение из кэша). При обновлении DNS Вы, вероятно, должны иметь TTL старого значения скорректировано ранее.

вы также можете использовать реализацию DNS Python, например DNSPython, вместо использования socket.gethostbyname - вы должны иметь полный контроль над кэшем распознавателя (но не кэши NS, которые использует распознаватель). Хотя, вероятно, это не исправит вашу проблему (с существующим кодом, я думаю).


DNS не кэшируется в Linux по умолчанию и требует Демона, такого как sssd или nscd. Вы можете просто перезапустить демона, чтобы принудительно вытягивать новый адрес.

Примечание для пользователей Windows: существует кэш по умолчанию, который можно очистить с помощью ipconfig /flushdns.

в качестве альтернативы у вас может быть жестко закодированная запись в /etc/hosts, проверьте сначала там. Такие инструменты, как dig или nslookup будет запрашивать DNS-сервер напрямую и обходить подсистему библиотеки NSS.