動作環境
CentOS 6.8 (64bit)
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37)
Ubuntu 16.04 LTS
Python 2.7.11+
C++ BuilderのUDP通信プログラムのデバッグとして、CentOS6.8で動作するPythonスクリプトを実装した。
処理
- UDPコマンドを受信する
- コマンドに対応する応答を返信する
code v0.1
udpResponder_171222.py
import socket as skt
import json
'''
v0.1 Dec. 22, 2017
- add [myDict] dictionary
- add udpResponder()
'''
# on Python 2.6.6
myDict = {
"hello": "hi",
"serious": "I'm serious",
}
RECV_TIMEOUT_MSEC = 300
def udpResponder(port_in):
inst = skt.socket(skt.AF_INET, skt.SOCK_DGRAM)
inst.bind(('', port_in))
inst.setblocking(0)
while True:
try:
data, adr = inst.recvfrom(RECV_TIMEOUT_MSEC)
except skt.error:
pass
else:
print("from:", adr)
print("rcvd:", data)
data = data.rstrip('\n')
data = data.rstrip('\r')
data = data.rstrip('\n')
#
rep = myDict.get(data)
if rep is None:
continue
print("ret:", rep)
inst.sendto(rep, adr)
udpResponder(7000)
- コマンド終端は
<CR><LF>
、<CR>
、<LF>
、<LF><CR>
に対応 - コマンド応答のテーブルはmyDictに記載している
- 別ファイルにしても良い
- csvやJSONにするなど
実行例
UDPコマンド送信側はNonSoftさんのUDP/IPテストツールを使わせていただきました。
いつも役立っています。
$ python udpResponder_171222.py
('from:', ('192.168.XXX.141', 9000))
('rcvd:', 'hello\r\n')
('ret:', 'hi')
('from:', ('192.168.XXX.141', 9000))
('rcvd:', 'serious\r\n')
('ret:', "I'm serious")
('from:', ('192.168.XXX.141', 9000))
('rcvd:', 'hi\r\n')
UDP/IPテストツール側
接続 (9000 )
送-> 192.168.XXX.140 (7000 )hello<CR><LF>
->受 192.168.XXX.140 (7000 )hi
送-> 192.168.XXX.140 (7000 )serious<CR><LF>
->受 192.168.XXX.140 (7000 )I'm serious
送-> 192.168.XXX.140 (7000 )hi<CR><LF>
切断 (9000 )
関連
Python 3
Visual Studio 2017 communityにPython 3環境を構築し、上記のコードを実行した。
data = data.rstrip('\n')
の部分で以下のエラーになった。
TypeError: a bytes-like object is required, not 'str'
Ubuntu 16.04 LTS + Python 3.5.2でも同じエラーになった。
以下のような処理が必要になる。
data = data.decode("utf-8")