Python を使ったプログラム間通信の仕方を勉強していた.
ずいぶん目標に近づいてきた.


情報の送信相手をみつけるために UDP を使ってブロードキャストにメッセージを投げる,という方法をとっていた,
受信側はいつもブロードキャストされるメッセージの受信待ち状態にいて,特定のメッセージが送られてきたら,返事をして自分の存在を発信者に知らせる.という仕組みだ.

これでも(シンプルで)良いように思うが,あまり洗練されていない気もする.

そこで,ネットワーク上でのサービスの提供・検出をするために提案されている規格に準拠した方式に切り替えることにした.
これにあたって,A氏からアドバイスを頂いた.

Apple が提案した Bonjour という仕組みがある.
詳細は Wikipedia にも詳しく書かれているが,Bonjour とは,面倒な設定をすることなく,ネットワーク上でサービスを登録する,あるいは登録されているサービスを検出する,ということを行う米Apple社が提案したプロトコルである.

Python でも Bonjour が使えるように pybonjour というパッケージがフリーで配布されている.
http://code.google.com/p/pybonjour/ からダウンロードできる.


☆インストール

$tar zxvf pybonjour-1.1.1.tar.gz
$cd pybonjour-1.1.1
$python setup.py build
$sudo python setup.py install

で簡単にインストール完了.


☆使ってみる

展開してできるディレクトリの中に examples というディレクトリがある.
試しにその中の browse_and_resolve.py と register.py を実行して挙動を確認する.

それぞれのソースコードは 配布元のホームページ に掲載されている.
同一物理ネットワークにつながる2台のホスト montepuluciano と barbaresco を使う.


=== Browse === === Register ===
montepulciano[2]python \
browse_and_resolve.py _myserv._tcp

Service added; resolving
Resolved service:
fullname = newserv._myserv._tcp.local.
hosttarget = barbaresco.local.
port = 60500
Service removed
Service added; resolving
Resolved service:
fullname = newserv._myserv._tcp.local.
hosttarget = barbaresco.local.
port = 60500
^C
 
barbaresco[14]python register.py \ 
newserv _myserv._tcp 60500

Registered service:
name = newserv
regtype = _myserv._tcp.
domain = local.
^C
barbaresco[15]python register.py \
newserv _myserv._tcp 60500

Registered service:
name = newserv
regtype = _myserv._tcp.
domain = local.
^C


register.py の引数には,サービス名,レジスタタイプ,ポート番号を渡す.
サービス名は任意,タイプは _xxx._tcp か _xxx._udp とするようだ.

Register を立ち上げた状態で,browse_and_resolve.py を起動する.
このとき,引数には,register.py に渡したのと同じレジスタタイプを指定する.

すると,Register がまずサービスを登録し,その内容を表示する.
次いで起動した Browser&Resolver がそのサービスを見つけて,resolve した情報を表示する.
ここで,Register を Ctrl+C で停止する.
すると Browser&Resolver は Service removed と表示して,サービスがなくなったことを示す.
再び register.py を起動すると,Browser&Resolver は再発見して resolve した内容を表示する.

このように,register と browse & resolve により,ネットワーク内のマシンへのサービスの登録と,ネットワーク内のマシンによって提供されているサービスの発見を行うことができる.


☆参考
Mac Dev Center dns_sd.h Reference




やじるし プログラム間通信関連メモの目次