はじめての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+Cnetcatを終わらせます。

次に、いつぞやのソケットプログラミングのコードをいじるとこんな感じ。

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