2017/04/17

プロトコル実装するライブラリを探したが、用途に合うものが無かった

2点間で通信しようとすると、まず通信仕様を決めなくてはならない。
プロトコルというやつだ。

物理的な通信仕様が決まったら、次は論理的な通信仕様を決めて、どこかの段階でデータの仕様も決めることになるだろう。
あるいは、データ仕様はRFCだったり既存の機種だったりで決められているものかもしれない。

 

さあ、ではこれを実装しよう、となったとき、内部で持っているデータ構造をプロトコルに合わせなくてはならない。
これが面倒で、比較的機械的な作業なのだけど、やらないといかん。

ただ、そういうものであれば、誰かユーティリティを作っていないだろうか?


まず思いついたのは、protobufだ。
名前はあちこちで見かけるので、使えそうな気がする。
しかしWikipediaを見ると「XMLとの比較で~」などと書かれているので、protobufフォーマットのプロトコルで通信したり、ファイルに保存したりするのであればよさそうだけど、決められたデータ形式に合わせた入出力にする、というものではないのだと思う。
Protocol Buffers - Wikipedia

 

他にもシリアライザーという種類のライブラリはあったのだけど、やはり独自フォーマットになるようだ。
まあ、よく考えれば、「プロトコル」と一言で書いても、テキストやバイナリがあるし、バイナリだってType-Length-Valueもあれば、Length-Type-Valueもあるし、データに構造が載っておらず順番だけで決めてしまうものもあろう。

そういうものに対応したライブラリを作ろうとしたら、作りが複雑になって、使うのも複雑になって、結局誰にも使われない、ということになってしまいそうだ。
だから、そういうライブラリはないんじゃなかろうか、という結論に至った。


では、部品レベルでもよいから作っておきたい場合、どういうものがよいだろうか。

私の場合、だいたいバイナリで通信するから、まずはバイナリが前提となる。
TLVなり、LTVなりが固定されている方がありがたい。ソースファイルだけ取り替えれば構造が変わるのがよいだろう。

あとは、エンディアンとアラインメントか。
私が使う環境はリトルエンディアンが多いのだが、プロトコルはビッグエンディアンだったり、ものによってはビッグとリトルが入り交じっていることもある。
そして、プロトコルの方は無駄がないようにデータを詰めるけど、プログラム上ではメモリ境界に沿わないと使えない。

アラインメントは、gccだと#pragma packで詰めたりもするのだけど、いつも罪悪感というか、そういうものを感じてしまう。。。
気にせずアクセスできるCPUならよいけど、そうじゃなかったら裏でコードを書いて対応していたと思うので、全体的にサイズが大きくなってしまうこともありそうだ。

 

そんなことを考えていくと・・・部品化せずに全部実装することになるんじゃないのか?
プロトコルの内容によって、機械的に解釈する方が効率的だったり、個別に解釈する方が効率的だったりするのを考慮してしまうと、部品化できなくなってしまうのだ。

そうではなくて、メンテナンス性の良さとか、今後の使い回しとか、そういうのも含めて考えないと。。。
とは思うのだが、また今回も個別に実装するような気がしている。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。