ofxUDPManagerで受信Portを変更する場合の注意

ofxUDPManagerで受信Portを変更する場合の注意

openFrameworksでUDP通信を受信したいときに、ofxUDPManagerを使って任意のPortをBindしますが、
Port番号を変更する所でちょっと躓いたのでメモ。

例えば私はアプリでUDPを使う場合、使い勝手を考えてofxUIから設定を変更出来るようにしています。

ofxUIを使ったネットワーク設定画面

ofxUIを使ったネットワーク設定画面

その時、ポートを変える為に何も考えずに再度 udp.Bind(20000); とかしちゃうとこんなエラーが出ます。
※openFrameworks_v0.9.3 Win/OSX で確認。

[ error ] ofxNetwork: ..\..\..\addons\ofxNetwork\src\ofxUDPManager.cpp: 140 EINVAL: invalid argument

たぶん既にポートを開いてる状態だとエラーが起こるようですね。
以下のように一度ポートをClose()で閉じて、Create()で初期化すると大丈夫でした。

// keyPressedとかBindする場所に書く
if (isBind) { // Bind済みかどうかのbool
	udp.Close();
	udp.Create();
}
isBind = udp.Bind(my_port); // 結果をisBindに保存。成功:true、失敗:false。

その時isBind()の返り値に成功・失敗がboolで帰ってくるので、この例ではbool型のisBindを作って保存する様にしています。
Bindに成功してる時だけudp.Receive()しておけば不要な処理も走らずエラーも出ないのでオススメです。

あ、それとポート開きっぱだと次回起動時にBindが失敗することがあるので、必ずexit()内でClose()するようにしてくださいね!

void ofApp::exit(){
    if(isBind) udp.Close();
}

以上、ofxUDPManagerのTipsでした。

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>