/// <summary> /// Receives a single message from the underlying ITunnel. /// </summary> /// <returns>The message received, or null if we failed to read a message.</returns> public Message Receive() { byte[] raw_message = Tunnel.Receive(); if (raw_message == null || raw_message.Length == 0) { Log.Trace("Empty read from ITunnel"); return(null); } var final_message = Suite.Decrypt(raw_message); try { var ret = Message.Parse(final_message); _last_received = DateTime.Now; return(ret); } catch { Log.Warn("Corrupt message data, ignoring"); return(null); } }