Exemple #1
0
        //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);
        }
Exemple #2
0
        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();
        }