//no decryption, no mac private void ReadPacketFromPlainStream() { int offset = _buffer.Offset; int packet_length = SSHUtil.ReadInt32(_buffer.Data, offset); if (packet_length <= 0 || packet_length >= MAX_PACKET_LENGTH) { throw new SSHException(String.Format("packet size {0} is invalid", packet_length)); } offset += PACKET_LENGTH_FIELD_LEN; byte padding_length = _buffer.Data[offset++]; if (padding_length < 4) { throw new SSHException(String.Format("padding length {0} is invalid", padding_length)); } int payload_length = packet_length - 1 - padding_length; Array.Copy(_buffer.Data, offset, _packet.Data, 0, payload_length); _packet.SetLength(0, payload_length); _buffer.Consume(packet_length + PACKET_LENGTH_FIELD_LEN); }
public void StartReceivingThread(Action <DataFragment> onDataCallback, Action onClosedCallback) { if (_socket == null || _receivingThread != null) { return; } _receivingThread = new Thread(() => { byte[] buffer = new byte[0x20000]; DataFragment dataFrag = new DataFragment(buffer, 0, 0); try { while (true) { int received = _socket.Receive(buffer, 0, buffer.Length, SocketFlags.None); if (received > 0) { dataFrag.SetLength(0, received); onDataCallback(dataFrag); } } } catch (Exception e) { if (!_shutdown) { System.Diagnostics.Debug.WriteLine(e.Message); System.Diagnostics.Debug.WriteLine(e.StackTrace); } if (!_socket.Connected && !_shutdown) { // closed by the peer onClosedCallback(); } } }); _receivingThread.Start(); }