Webサーバでないサーバ(C言語)に、HTML5で作られた端末の間で常時通信させるため、C言語版WebSocketのライブラリを探してみたところ、以下の候補が見つかりました。
- libwebsockets
-
cwebsocketGitHubへ移行 - cwebsocket(GitHub)
libwebsocketsはサンプルをすぐに動かすことができましたが、cwebsocketは実行できませんでした。後者は2010年から更新されていないようですし libwebsocketsを使うことにしました。
以下、サンプル実行までの様子です。
付属サンプル実行
libwebsockets
Ubuntu 12.04上でサーバ・サンプルをビルドして動かしてみました。
$ cd ~
$ wget http://git.warmcat.com/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.4-chrome43-firefox-36.tar.gz
$ tar xvzf libwebsockets-1.4-chrome43-firefox-36.tar.gz
$ cd libwebsockets-1.4-chrome43-firefox-36
$ mkdir build
$ cd build
$ cmake ..
$ make
$ cd bin
$ ./libwebsockets-test-server --resource_path=~/libwebsockets-1.4-chrome43-firefox-36/test-server
サンプルプログラムであるlibwebsockets-test-serverは、resource_pathオプションでは相対パスで無く絶対パスを指定しないダメなようです。
ブラウザを複数立ち上げlocalhost:7681/にアクセスすると、ブラウザ上で手書きメモを共有するサンプルが見られます。ライブラリの中身はこれから見ていきますが、何の苦労も無くスムースにサンプルプログラムを実行できたので好印象です。
cwebsocket
最初からビルド済み実行ファイルを入手できますが、こちらは
error on websocket!
websocket closed
となって処理できないようです。
サーバ側のエラーを見るとOriginがnullとなっているので、XSSチェックでエラーになっている?のかもしれません(よく判っていません)。
Connected 127.0.0.1:50890
In packet:
GET /echo HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: uzPyBvU3/YJiHaWQWK5yRg==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Error in incoming frame
Disconnected
cwebsocket(GitHub)の方でも同じような結果でした。