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サーバコードは以下にあります。(詳細については関連記事参照)