C#でWebソケットサーバーを開発していると、Web Socketが正しくアップグレードされていますが、フレーム受信時にフレームが正しく表示されないようですが、C#WebSocketサーバーフレームデコードが動作していないとメッセージが分からないオペコード
public string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
private string decryptFrame(Socket sock)
{
// busy wait untill something is sent
while (sock.Available == 0) { }
var header = new byte[6];
sock.Receive(header);
var length = header[1] & 127;
Console.WriteLine("Recived header >> " + this.ByteArrayToString(header));
var body = new byte[length];
sock.Receive(body);
Console.WriteLine("Recived body >> " + this.ByteArrayToString(body));
for (var i = 0; i < length; i++)
{
body[i] ^= header[2 + (i & 3)];
}
Console.WriteLine("decoded body >> " + this.ByteArrayToString(body));
string resp = Encoding.UTF8.GetString(body, 0, length);
Console.WriteLine("Parsed body >> " + resp);
return resp;
}
問題はクロームフレームがインであるということである:フレームから
bool started = false;
// to write something back.
while (bClientConnected)
{
try
{
msg = this.decryptFrame(client.Client);
Console.WriteLine("Client Frame Decrypt: " + msg);
//sWriter.WriteLine("pong!");
//sWriter.Flush();
}
catch (Exception)
{
Console.WriteLine("Connection from " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString() + " was terminated unkown reason.");
bClientConnected = false;
client.Close();
continue;
}
started = true;
}
コード解析用とフレームのデバッグを読んで処理するための
コードtantlyフレーム内(Opcode -1)
表示を示すと
Recived header >> 88909495d0d4
Recived body >> 977f85bafffbbfa3fab5bfa4f7fab4b1
decoded body >> 03ea556e6b6e6f776e206f70636f6465
Parsed body >> ?Unknown opcode
Client Frame Decrypt: ?Unknown opcode
、問題は、私はビットで動作することはできませんですので、必要とされますC#のレベルではバイトレベルで、9と15の両方はバイト位置にありません。 8ビット= 1バイト、[0,1,2,3,4,5,6,7] [8,9,10,11,12,13,14,15]だから私は間違った8番目のビットが私のバイトポジション2で –
私は小さな例で答えを更新しました – vtortola
更新していただきありがとうございます。それでは、バッファを4(32ビット)に変更できますか?ヘッダーのみを読み込むには?理由のメソッドとして私はSocket.Receiveを使用している場合は、フレームのための定数バイト長さがあればいいだろう。 –