動作確認
UDP受信側: RaspberryPi2 + raspbian
UDP送信側: MacOS X 10.8.5
RPi側のpythonでのUDP受信が成功したようだ。
敗因は、「CentOSでやれば楽」と思いファイアウォールをONのまま実行して失敗していた。
RPiは初期状態でファイアウォールによるクローズがないようで、以下の処理がすんなり実行できた。
try1 (ブロッキング受信)
以下はRPi側のコード。
151111d.py
import socket
UDP_IP = ""
UDP_PORT = 6000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024)
print "rcvd:", data
RPi2側で以下を実行しておく。
pi@raspberrypi ~/lineMonitor $ python 151111d.py
MacOSX側で以下を実行する。-w 1
をつけることで、1秒後にターミナルに処理が戻ってくる。
$ echo "test" | nc -w 1 -u 192.168.10.5 6000
$ echo "test" | nc -w 1 -u 192.168.10.5 6000
$ echo "test" | nc -w 1 -u 192.168.10.5 6000
RPi2側の結果。
pi@raspberrypi ~/lineMonitor $ python 151111d.py
rcvd: test
rcvd: test
rcvd: test
CentOSでUDP通信の実装をする場合は、ファイアウォールで使うポートを開けましょう。
try2 (ノンブロッキング受信)
ノンブロッキング受信がやりたかった。
参考 SO
以下でできた。
151111e.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('',6000))
s.setblocking(0)
data=''
address=''
while True:
try:
data,address = s.recvfrom(120)
except socket.error:
pass
else:
print "rcvd:", data