private DataFragment ReceivePacket() { while (true) { DataFragment data = _packetReceiver.WaitResponse(); PacketType pt = (PacketType)data.ByteAt(0); //shortcut if (pt == PacketType.SSH_MSG_IGNORE) { SSH1DataReader r = new SSH1DataReader(data); r.ReadPacketType(); if (_eventReceiver != null) { _eventReceiver.OnIgnoreMessage(r.ReadString()); } } else if (pt == PacketType.SSH_MSG_DEBUG) { SSH1DataReader r = new SSH1DataReader(data); r.ReadPacketType(); if (_eventReceiver != null) { _eventReceiver.OnDebugMessage(false, r.ReadString()); } } else { return(data); } } }
public override void OnData(DataFragment data) { try { _buffer.Append(data); //ここで複数パケットを一括して受け取った場合を考慮している while (ConstructPacket()) { if (_packet.Length >= 1 && _packet.ByteAt(0) == (byte)PacketType.SSH_MSG_NEWKEYS) { // next packet must be decrypted with the new key lock (_cipherSync) { _waitingNewCipher = true; // Note: SSH2SynchronizedPacketReceiver.OnData() queue the packet then // wait until the packet is dequeued _inner_handler.OnData(_packet); Monitor.Wait(_cipherSync, 1000); if (_waitingNewCipher) { // something is going wrong... _waitingNewCipher = false; _cipher = null; _mac = null; _macEnabled = false; _head = null; } } } else { _inner_handler.OnData(_packet); } } } catch (Exception ex) { OnError(ex); } }
private PacketType SneakPacketType(DataFragment data) { return((PacketType)data.ByteAt(0)); }
private bool IsMsgNewKeys(DataFragment packet) { return(packet.Length >= 1 && packet.ByteAt(0) == (byte)PacketType.SSH_MSG_NEWKEYS); }