/// <summary> /// Sends a WebSocket frame to the client. /// </summary> /// <param name="dt">The data to be sent.</param> /// <param name="msgType">The type of message sent.</param> /// <returns>Completed Task</returns> public virtual async Task SendAsync(ArraySegment <byte> dt, WSOpcodeType msgType) { if (!handShaked) { return; } if (disposed) { return; } if (closed) { return; } var data = dt.Array.SubArray(dt.Offset, dt.Count); //if (data.Array == null) //throw new ArgumentNullException($"Inner array of argument \"{nameof(data)}\" cannot be equal to null."); byte[] d = WSArrayHelpers.ToFrameData(data, msgType); if (secure) { await secureStream.WriteAsync(d, 0, d.Length); } else { await client.GetStream().WriteAsync(d, 0, d.Length); } if (msgType == WSOpcodeType.Close && !disposed) { await DisposeAsync(); } }
private Task OnReceive(WebSocketInstance arg1, byte[] arg2, WSOpcodeType arg3) { if (arg3 == WSOpcodeType.Text) { Console.WriteLine(Encoding.UTF8.GetString(arg2)); } return(Task.CompletedTask); }
/// <summary> /// Converts data into a WebSocket frame. /// </summary> /// <param name="data">The input data to be converted.</param> /// <param name="msgType">The Opcode type of the data.</param> /// <returns>A valid WebSocket frame built from the data and Opcode type.</returns> public static byte[] ToFrameData(ArraySegment <byte> data, WSOpcodeType msgType) { byte[] response; byte[] bytesRaw = data.Array; byte[] frame = new byte[10]; int indexStartRawData = -1; int length = bytesRaw.Length; frame[0] = (byte)(128 + (int)msgType); if (length <= 125) { frame[1] = (byte)length; indexStartRawData = 2; } else if (length >= 126 && length <= 65535) { frame[1] = (byte)126; frame[2] = (byte)((length >> 8) & 255); frame[3] = (byte)(length & 255); indexStartRawData = 4; } else { frame[1] = (byte)127; frame[2] = (byte)((length >> 56) & 255); frame[3] = (byte)((length >> 48) & 255); frame[4] = (byte)((length >> 40) & 255); frame[5] = (byte)((length >> 32) & 255); frame[6] = (byte)((length >> 24) & 255); frame[7] = (byte)((length >> 16) & 255); frame[8] = (byte)((length >> 8) & 255); frame[9] = (byte)(length & 255); indexStartRawData = 10; } response = new byte[indexStartRawData + length]; int i, reponseIdx = 0; //Add the frame bytes to the reponse for (i = 0; i < indexStartRawData; i++) { response[reponseIdx] = frame[i]; reponseIdx++; } //Add the data bytes to the response for (i = 0; i < length; i++) { response[reponseIdx] = bytesRaw[i]; reponseIdx++; } return(response); }