Socket Multicast 通信

@IT Monoistの記事、https://monoist.atmarkit.co.jp/mn/articles/1111/08/news002.html でも紹介した、SocketによるMulticast通信、実は私かなり嵌ってます。

Wi-Fi LANなどで、アドホックに接続されたデバイスノードに、とりあえずデータを送りつけてデータをシェアしたい、こういう状況は実は結構あるのではないかと思っています。Socketによるコネクションレスの通信UDPを使い、IGMP(Internet Group Management Protocol)という名前のプロトコルを使った通信を使うと、軽い情報を飛ばしあってデータを共有しあう通信を実現することができます。IGMPの詳細に興味のある方は、https://technet.microsoft.com/ja-jp/library/cc787925(WS.10).aspx を参照してください。IGMPは最近のWi-Fiルーターだったらほとんどサポートしているようで、LANに、Wi-Fi接続できるデバイスであれば活用が可能です。

IGMPを使うには、以下の手順を踏みます。

  1. UDPでSocket接続
  2. グループ通信用に予め決められた、IPアドレス、ポートでグループにJoin
  3. Socketへのデータ送信→グループにJoinしているデバイスノードにデータが送信され受信

手順も凄くシンプル。私はセキュリティの専門家ではないので、断言は出来ませんが、

  • 通信がLANで閉じている
  • グループにJoinしなければデータの送受信は出来ない
  • 送信する相手そのものを明示的には指定できない

という特徴を持っているので、手軽で軽くシンプルで比較的安全な通信方法といえるのではないかと(まちがっていたらごめんなさい)思っています。

例えば、環境センサー付デバイスがネットワークに接続され、環境データを定期的に観測して、ネットにマルチキャストする、送られたデータは、それを使いたいデバイスがグループにJoinして、受信し、それぞれのアプリケーション、サービスで活用、とか、ソーシャルネットのより閉じたミニコミュニティ通信で活用する、とか、クイズへの早押し通知や、何かの投票状況集め、店舗内での特売情報受信とか、まぁ色々と応用が考えられるかなと。

.NET Frameworkでは、この通信を使う為のクラスが用意されていて、それを使えば、比較的簡単にGroup Multicast通信を取り込むことが出来ます。残念ながら、Full .NET、Windows Phone 7向け、.NET Micro Frameworkで全く同じクラスは用意されていません。各フレームワークについては、以下のような感じでクラスが用意されています。

フレームワーク クラス名 備考
Full .NET Socket、または、UdpClient Desktopなど
Sivlerlight UdpAnySourceMulticastClient Windows Phone、RIA、DesktopのOOBアプリ
.NET Micro Framework Socket ちょっと面倒

表のように、同じクラスではないですが、それぞれ使えるクラスを使ってUDP Multicastグループ通信を実装することが可能です。

それぞれの場合の使い方は、今後のブログポストで。