15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Raspberry PiでC/C++によるwebsocketサーバを立ち上げる

Last updated at Posted at 2017-08-19

開発に至った背景

C言語で開発したOpenCVのアプリケーションからwebsocketで画像を配信するとき、OpenCVと同じC++からWebSocketで画像を配信しようと思ったのがスタートです。探していたところ、cwebsocketを見つけましたが、残念ながらオリジナル版はRaspberry Piで動かなかったため、Raspberry Piとx86のどちらでも動作するように修正をしました。

オリジナル版からの変更点

次の修正をして、http://github.com/NaotakaSaito/cwebsocketに公開しました。

  1. Base64エンコードの処理を修正して32bit/64bitの双方で動くようにしました。
  2. 将来、multi clientに対応できるようSocketのノンブロッキングを使用するように修正しました。(今現在、同時接続可能なクライアントは1台です)
  3. WebSocketサーバーを安全に終了できるように修正しました。
  4. gcc,g++,c++のどれでもコンパイルできるようにしました。
  5. 複数のクライアントに対応しました。(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でも同じように動きます。

2017-08-19-113647_1440x900_scrot.png

オリジナル版の動かし方

オリジナル版のソースコードは、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状態でサーバーを再起動できないという問題もありました。

15
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?