boost::asioでudp通信をする

どうも、吉村です。

複数のPCを連携させたい時の一つの方法としてUDP通信があります。
特にデータを絶え間なくPC1からPC2に送信しつづけて、途中のデータロストをある程度許容できるような用途であれば、
UDP通信はとても適した選択肢です。

unix socketプログラミングを行っても良いのですが、
低レイヤーなコーディングは結構面倒なので、
今回はboostを使っていこうと思います。

送るデータはこちらです

まずは受信側からです。

io_serviceが中核となるクラスで、
endpointによりポートを指定し、
receive_fromにてデータを受け取ります。

注意しなければならないのは、
receive_fromはデータを受け取るまで実行コンテキストをブロッキングするということです。
状況に応じてサブスレッドでこれを実行しなければならない場合もあるでしょう。
macの場合、GrandCentralDispatchがあり、C++でも使えるのでそちらを使うのも良いと思います。

では送信側です。

endpointで送信先のipアドレスとポートをセットし、
send_toで送信します。

どちらもboost::asio::bufferのおかげで楽に構造体とバインドできていることがわかります。
送信側はわりと同期的に実行しても良い気がしますが、非ブロッキングを重用視するならば、
dispatch_async等でやっても良いでしょう。

以外と簡単にUDP通信ができてしまいました。
さすがboostといったところでしょうか。

実際の所、boost::asioには非同期処理に関するAPIが沢山あり、
本当ならばそっちを使うのが良いのかもしれませんが、
正直APIが分かりにくく、今回のようなシンプルな実装で済む場合はそこまで踏み込まなくても良いかと思います。