Как очистить кеш для ответа socket.gethostbyname? - PullRequest
7 голосов
/ 03 августа 2011

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

После обновления DNS-записей ... я делаю dig для '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 ]

6 голосов
/ 03 августа 2011

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

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

3 голосов
/ 04 августа 2011

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

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

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

...