private void OnTextFrameReceived(byte[] buf, WsHeader header) { if (header.PayloadLength <= 125) { if (header.Mask) { var decodedValues = new List <byte>(); byte[] maskKey = new[] { buf[2], buf[3], buf[4], buf[5] }; // TODO: span slice でもっと見やすく for (int i = 6; i < buf.Length; i++) { byte e = buf[i]; byte m = maskKey[(i - 6) % 4]; decodedValues.Add((byte)(e ^ m)); } Console.WriteLine($"decoded (hex): {string.Join(" ", decodedValues.Select(x => x.ToString("X2")))}"); Console.WriteLine($"decoded (str): {Encoding.UTF8.GetString(decodedValues.ToArray())}"); } } else if (header.PayloadLength == 126) { // TODO: } else if (header.PayloadLength == 127) { // TODO: } }
private void OnDataFrameReceived(byte[] buf) { Console.WriteLine("--------------------------------------------------"); Console.WriteLine(string.Join(" ", buf.Select(x => x.ToString("X2")))); var header = WsHeader.Parse(buf); Console.WriteLine(header); switch (header.OpCode) { case OpCode.Text: OnTextFrameReceived(buf, header); break; case OpCode.Close: OnCloseReceived(); break; } }
private async Task ProcessSendQueue() { if (_sendQueue.Count == 0) { return; } if (!_sendQueue.TryDequeue(out string str)) { return; } var bytes = new List <byte>(); var data = Encoding.UTF8.GetBytes(str); // TODO: ヘッダを正しく組み立ててないみたいで、127バイト以上は動作していない。直す。 var header = WsHeader.Create(true, OpCode.Text, data.Length); bytes.AddRange(header.ToBinary()); bytes.AddRange(data); var arr = bytes.ToArray(); await _stream.WriteAsync(arr, 0, arr.Length).ConfigureAwait(false); }