private bool processPacket(ref NetworkStream stream) { try { string data = string.Empty; for (int i = 0; i < packets.Count; i++) { SocketPacket packet = packets[i]; if (packet.operation == 1) { if (packet.isMasked) { byte[] decoded = setMask(packet.payload, packet.mask); data = data + Encoding.UTF8.GetString(decoded); } } } packetCallback?.Invoke(sessionID, data); return(true); } catch (Exception ex) { return(false); } }
private void Worker_DoWork(object sender, DoWorkEventArgs e) { isRunning = true; NetworkStream stream = client.GetStream(); while (true) { if (stream.DataAvailable) { if (isHandShake) { if (makeHandShake(ref stream)) { isHandShake = false; } } else { SocketPacket packet = new SocketPacket(); if (readPacket(ref stream, ref packet)) { packets.Add(packet); if (packet.fin) { processPacket(ref stream); packets.Clear(); } } } } else { Thread.Sleep(100); } } }
private bool readPacket(ref NetworkStream stream, ref SocketPacket packet) { try { //first byte handling int firstByte = stream.ReadByte(); packet.fin = (firstByte & (1 << 7)) != 0; packet.rsv1 = (firstByte & (1 << 6)) != 0; packet.rsv2 = (firstByte & (1 << 5)) != 0; packet.rsv3 = (firstByte & (1 << 4)) != 0; packet.operation = firstByte & ((1 << 4) - 1); int secondByte = stream.ReadByte(); packet.isMasked = (secondByte & (1 << 7)) != 0; int length = secondByte; if (packet.isMasked) { length = length - SocketPacket.OFFSET_128; } if (length > 0 && length < SocketPacket.EXTENDED_PAYLOAD_LENGTH_126) { packet.length = (ulong)length; } else { byte[] tempLength = null; //big packet if (length == SocketPacket.EXTENDED_PAYLOAD_LENGTH_126) { tempLength = new byte[2]; stream.Read(tempLength, 0, tempLength.Length); Array.Reverse(tempLength); packet.length = (ulong)BitConverter.ToInt16(tempLength, 0); } //biggest packet else if (length == SocketPacket.EXTENDED_PAYLOAD_LENGTH_127) { tempLength = new byte[8]; stream.Read(tempLength, 0, tempLength.Length); Array.Reverse(tempLength); packet.length = (ulong)BitConverter.ToInt64(tempLength, 0); } } packet.mask = new byte[4]; if (packet.isMasked) { stream.Read(packet.mask, 0, packet.mask.Length); } packet.payload = new byte[packet.length]; stream.Read(packet.payload, 0, packet.payload.Length); return(true); } catch (Exception ex) { return(false); } }