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

本章ではpythonのsockeライブラリを使用して、サーバ起動ボタン押下でUDPサーバを起動するようにしてみました。
ただし、DNSサーバとしての動作(IPアドレス応答)は行わず、受信データを出力するのみ。
UDP socket
そのうち詳しく勉強しようと思うけど、今はとりあえず最低限のUDPサーバ通信の使い方だけ。
| メソッド | 処理 | 
|---|---|
| socket | UDP用のSocketを作成 | 
| bind | ServerのIP、Portを設定 | 
| recvform | Cliantからの受信待ち | 
| sendto | Serverへ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サーバコードは以下にあります。(詳細については関連記事参照)

 https://telecom-engineer.blog/python-dns-6/
 https://telecom-engineer.blog/python-dns-6/
 https://github.com/hiro-telecom-engineer/python-dns
 https://github.com/hiro-telecom-engineer/python-dns