[新]なんでも日記[新]なんでも日記ジャンル不定の日記です。い合わせ問い合わせ問い合わせsocatでwebsocketサーバーができなかった件socatでwebsocketサーバーを作ろうとしてうまく行かなかったが、わかった。socatに-vオプションつけてターミナルに出力してみたが、なんかバイナリぽいのが出力された。socatから実行するシェルスクリプトではreadで1行ずつ読んでたが、readじゃバイナリが読めずに変数に空文字が入ってた感じぽい。今回はクライアントから"test"をsendしてたんだが、readではなくcatでファイルに出力してバイナリエディタで見てみたが、"8184E4F2CFA39097BCD7"↑こんなデータだった。WebSocketの仕様について調べたが、ハンドシェイクのあとはデータは特殊なフレーム化されて送られるのね。FIN最後のフレームの場合1で、続きがある場合は0byteじゃなくてbitなのね。今回の"8184E4F2CFA39097BCD7"を2進に変換すると、"10000001100001001110010011110010110011111010001110010000100101111011110011010111"1bit目は1なんで1フレームで終わり。2bit目からの3bitは予約bitで、仕様を拡張するのに使うようで、そんなものはないので今回は"000"。5bit目からの4bitはデータの種別を表すようで、テキストデータの場合は"0001"9bit目はマスクの有無クライアントから送るデータはマスク必須で、サーバーから送るデータはマスク不可。いうわけで"1"10bit目からの7bitがデータの長さで単位はbyteなんだが、値が126の場合は続く2byteがデータ長。127の場合は続く8byteがデータ長。125以下の場合は続かずその値がデータ帳となる。今回は"test"と4byteをsendしたんで、"0000100"(4)ここまでbit単位になっているが、合計すると16bitで2byteになる。残りのデータはbyte単位。3byte目からの4byteはマスク用keyで、7byte目から残り全部はペイロードデータ。ペイロードデータは、拡張データとアプリデータを連結したもので、予約bitが"000"で何も拡張されてなければ拡張データは存在しないので、ペイロードデータ=アプリデータになる。アプリデータは単なる平文ではなく、マスク用keyと元のデータをXORしたものになっている。マスク用keyは4byteだが、データが5byte以上ある場合はループして5byte目はマスク用keyの1byte目とXORされる感じ。10100011"になってる。11010111"元のデータにマスク用keyをXORしてアプリデータになったわけだが、XOR演算は再度XORすれば元のデータに戻る。01110100"ASCIIコードの"test"ですね。Comment(1)この記事へのコメント実験をちょっと進めてみたが、bit演算をする方法が見つからんかった。バイナリの読み込みはddとかcatでできるぽい。echo経由でやったら非ASCIIだからと思うが期待値が出ない。出力はprintfでできる。変数への代入は"\x01"みたいな感じでできる1byte読み取ってANDかシフトで判定する必要があるが、letだと期待値にならない。17:47:37コメントを書く名前:URLコメント:eth0が不安定だったようだが・・・[AD]rentafree.net。