私は Python ソケットをいじっており、非常に基本的なネーム サーバー (つまり、ドメイン名から IP アドレスへのルックアップ テーブル) を実装できるかどうかを確認することにしました。これまでのところ、受信したデータを単にダンプするようにサーバーをセットアップしました。
#!/usr/bin/python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = ''
port = 53
size = 512
s.bind((host, port))
while True:
data, addr = s.recvfrom(size)
print repr(data)
上記のコードを実行して DNS を 127.0.0.1 にポイントすると、次のような結果が得られます。
'Y\x04\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01'
'J\xaa\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x1c\x00\x01'
'Y\x04\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x06google\x03com\x00\x00\x01\x00\x01'
DNS質問パケット構造に関係していると思いますが、よくわかりません。
A) 上記はエスケープ文字ですか? 特定のテキストエンコーディング?それとも単なるバイト?
B) どのようにデータを解釈して操作できますか?
編集:データグラムの代わりに raw を取るようにソケットを変更すると、次のようになります。
'E\x00$\x00\xe4\x96\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x03\x03X\xb6\x00\x00\x00\x00E\x00V\x00m\x82\x00\x00\xff\x11\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\xf3\xe1\x005\x00B\x00\x00'