はじめてのUDP
なんでUserDatagramProtocol(以下、UDP)かって言うと、
OpenSoundControl(以下、OSC)について調べてるうちに、
これで面白いことできないかなーって調べていて、
出来なくもなさそうなので、まずは”hello world”してみました。
MIDIケーブルを使った通信がいわゆるシリアル通信であるように、
OSCもUDPを使ってパケットを送信します。
あとはOSCの仕様に沿ってバイト列を構築する必要がある訳ですが、
まずは、いわゆる”hello world”から。
先に、UDPで受け取った内容を表示する方法について。
OSCであれば、PureDataでも使って何かすれば良いのですが、
もっと簡単に確認したいので、Homebrewでインストールしたnetcat
を使います。
送信する前に、こんな感じで受信する準備を済ませておきます。
$ nc -l -p 12345 -u localhost
1つ目の送信方法は、こんな感じ。
use strict; use warnings; use v5.14; use Net::OpenSoundControl::Client; my $client = Net::OpenSoundControl::Client->new( Host => "localhost", Port => 12345 ) or die "Could not start client: $@\n"; $client->send( ['/foo', 's', 'hello world' ] );
あらかじめ、cpanm
でインストールしておいた、
Net::OpenSoundControl
を使って、とりあえず”hello world”してみます。
$ nc -l -p 12345 -u localhost
/foo,shello world
受信し終えたらreturnキーを押すか、
control+C
でnetcat
を終わらせます。
次に、いつぞやのソケットプログラミングのコードをいじるとこんな感じ。
use strict; use warnings; use v5.14; use IO::Socket; my $s = IO::Socket::INET->new( PeerAddr => 'localhost', PeerPort => 12345, Proto => 'udp' ) or die $!; $s->print( "hello world" ); $s->close;
$ nc -l -p 12345 -u localhost
hello world
close
を呼ぶ必要があるのか、現時点ではわからないですが、
netcat
を終わらせる方法は、前述の通りです。
あと、スクリプトを何回実行しても、最初の1回しか受信できなくて、
netcat
を毎回実行する必要があるのですが、
PureDataでも同様で、毎回サーバーを立ち上げ直す必要があって、
この辺の挙動は同じではあるんだけど理解できてないです。
追記 2018/12/01
クライアントの切断を検出するのに、
KeepAliveを意味するパケットを投げるという方法を見つけたのですが、
これって、MIDIとやってることが同じですね。。。
でも、これが妥当なんですかね。
— ここまで —
OSCを受信する側を作るか、送信する側を作るかは、
一切、決めてないですが、少しずつ勉強する予定です。
おしまい。
Leave a Comment