pythonでDNSサーバ作成 ~③socketでUDPサーバを起動しよう~

DNSサーバ作成,python,TCP/IP

本章ではpythonのsockeライブラリを使用して、サーバ起動ボタン押下でUDPサーバを起動するようにしてみました。

ただし、DNSサーバとしての動作(IPアドレス応答)は行わず、受信データを出力するのみ。

UDP socket

そのうち詳しく勉強しようと思うけど、今はとりあえず最低限のUDPサーバ通信の使い方だけ。

メソッド処理
socketUDP用のSocketを作成
bindServerのIP、Portを設定
recvformCliantからの受信待ち
sendtoServerへmessageを送信

コーディング

from socket import socket, AF_INET, SOCK_DGRAM

def udp_recv( ip_addr ):
	# 受信側アドレスをtupleに格納
	SrcAddr = ( ip_addr , 53 )
	# バッファサイズ指定
	BUFSIZE = 1024
	# ソケット作成
	udpServSock = socket(AF_INET, SOCK_DGRAM)
	# 受信側アドレスでソケットを設定
	udpServSock.bind(SrcAddr)
	print("サーバ起動")
	# While文を使用して常に受信待ちのループを実行
	while True:
		# ソケットにデータを受信した場合の処理
		# 受信データを変数に設定
		data, addr = udpServSock.recvfrom(BUFSIZE)
		# 受信を出力
		print(data)
		print(data.decode(), addr)
		# 応答はいったんコメントアウト 
		# udpServSock.sendto(data,addr)
		# break

動作確認

コマンドプロンプトでnslookupを実行した際の画面。

>nslookup dns.test1.jp 127.0.0.1
DNS request timed out.
    timeout was 2 seconds.
サーバー:  UnKnown
Address:  127.0.0.1

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** UnKnown への要求がタイムアウトしました

pythonで実装したUDPサーバの出力結果。

> python app.py
 イベント: btn_udp_open , 値: {'domain_d1': 'dns.test1.jp', 'ip_d1': '127.0.0.2', 'domain_d2': 'dns.test2.jp', 'ip_d2': '127.0.0.3', 'domain_d3': 'dns.test3.jp', 'ip_d3': '127.0.0.4', 'ip_dns': '127.0.0.1'}
DNSサーバ起動
サーバ起動
b'\x00\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x011\x010\x010\x03127\x07in-addr\x04arpa\x00\x00\x0c\x00\x01'
100127in-addrarpa
                  ('127.0.0.1', 50089)
b'\x00\x02\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x05test1\x02jp\x00\x00\x01\x00\x01'
dnstest1jp ('127.0.0.1', 50090)
b'\x00\x03\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x05test1\x02jp\x00\x00\x1c\x00\x01'
dnstest1jp ('127.0.0.1', 50488)
b'\x00\x04\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x05test1\x02jp\x00\x00\x01\x00\x01'
dnstest1jp ('127.0.0.1', 50489)
b'\x00\x05\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03dns\x05test1\x02jp\x00\x00\x1c\x00\x01'
dnstest1jp ('127.0.0.1', 50490)

課題1 DNSの応答

なんでこんな受信データになっているのかよくわからん。
勉強しよ。

課題2 サーバの停止

udpソケットにて受信待ちのwhileループがあるため、GUIがボタンを認識しなくなってしまう。なのでスレッドを実装する。

コード

最終的なDNSサーバコードは以下にあります。(詳細については関連記事参照)