Edited at

RPi / python > udp > ブロッキング受信: 成功 > ノンブロッキング受信: 成功

More than 1 year has passed since last update.


動作確認

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