開発に至った背景
C言語で開発したOpenCVのアプリケーションからwebsocketで画像を配信するとき、OpenCVと同じC++からWebSocketで画像を配信しようと思ったのがスタートです。探していたところ、cwebsocketを見つけましたが、残念ながらオリジナル版はRaspberry Piで動かなかったため、Raspberry Piとx86のどちらでも動作するように修正をしました。
オリジナル版からの変更点
次の修正をして、http://github.com/NaotakaSaito/cwebsocketに公開しました。
- Base64エンコードの処理を修正して32bit/64bitの双方で動くようにしました。
- 将来、multi clientに対応できるようSocketのノンブロッキングを使用するように修正しました。(今現在、同時接続可能なクライアントは1台です)
- WebSocketサーバーを安全に終了できるように修正しました。
- gcc,g++,c++のどれでもコンパイルできるようにしました。
- 複数のクライアントに対応しました。(2017年9月13日)
修正版コードの使用方法
以下の手順でソースコードを取得、ビルドをしてサーバーを起動したら、cwebsocket/client.htmlをブラウザで起動してください。
コンソール画面
$ git clone git://github.com/NaotakaSaito/cwebsocket
$ cd cwebsocket/raspberry_pi
$ make
$ ./websocket
opened 0.0.0.0:8088
connected 127.0.0.1:48092
disconnected
ブラウザ側の画面
画面はRaspberry Piではないのですが、Raspberry Piでも同じように動きます。
オリジナル版の動かし方
オリジナル版のソースコードは、http://github.com/m8rge/cwebsocketにあります。こちらは、x86なら問題なく動作します。
オリジナル版の動かし方
git clone git://github.com/m8rge/cwebsocket
cd cwebsocket
cd x86_server
cp ../lib/* .
gcc main.c websocket.c -o websocket
./websocket
オリジナル版をRaspberry Piで動かした時の問題点
Raspberry Piで実行して起動することができますが、ブラウザから接続すると「Sec-WebSocket-Accept」でエラーが発生します。私はWebSocket自体は詳しくないのですが、原因はBase64のエンコード部分にCPUのビット幅に依存したコードがあり、エンコード結果が間違ってしまいブラウザ側でエラーが発生していました。
また、オリジナル版はクライアントを接続した状態でサーバー側をCtrl+Cで終了すると、しばらくの間ポートがbusy状態でサーバーを再起動できないという問題もありました。