8

誰もが前にこれに遭遇します:

DNSレコードを更新した後、「test.somedomain.com」を検索すると167.69.143.234になりますが、socket.gethostbyname('test.somedomain.com')を実行すると167.69.6.234になります。

ソケットはまだキャッシュを使用していると思います...どうすればクリアできますか?またはそれをフラッシュしますか?

私のコードは非常に単純です:

LinuxTermianl

dig test.somedomain.com

Python:

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

DNSで更新されたアドレスである167.69.143.234アドレスを返す必要があります。

4

2 に答える 2

7

Pythonsocket.gethostbynameはオペレーティングシステムリゾルバーを使用しており、キャッシュをクリアするためのAPIはありません。キャッシュ(オペレーティングシステムまたはオペレーティングシステムまたは標準ライブラリコンポーネントによって使用されるキャッシングDNSサーバーの場合があります)はDNSシステムの基本要素であり、それに対処するための「正しい方法」は、レコードのTTL値まで待機することです。有効期限が切れます(オペレーティングシステムは、キャッシュから古い値を削除する必要があります)。DNSを更新するときは、おそらく古い値のTTLを以前に調整しておく必要があります。

を使用する代わりに、DNSPythonなどのPython DNS実装を使用することもできます。そのsocket.gethostbyname場合、リゾルバーキャッシュを完全に制御する必要があります(ただし、リゾルバーが使用するNSのキャッシュは制御できません)。しかし、それはおそらくあなたの問題を解決しないでしょう(既存のコードでは、私は推測します)。

于 2011-08-03T15:04:58.883 に答える
4

DNSはデフォルトではLinuxにキャッシュされず、sssdまたはなどのデーモンが必要ですnscd。デーモンを再起動するだけで、新しいアドレスを強制的に取り込むことができます。

Windowsユーザーへの注意:。でクリアできるデフォルトのキャッシュがありますipconfig /flushdns

または、にハードコードされたエントリがある場合が/etc/hostsあります。最初にそこを確認してください。DNSサーバーを直接クエリし、NSSライブラリサブシステムをバイパスするようdigなツール。nslookup

于 2011-08-04T08:28:33.660 に答える