はじめての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