public virtual async Task SendMessage(Message m, CancellationToken cancel)
        {
            if (m.header == null)
            {
                m.header = new MessageHeader();
            }

            if (m.entries.Count == 1 && (int)m.entries[0].EntryType <= 500)
            {
                m.header.ReceiverNodeName = RemoteNodeName;
                m.header.SenderNodeName   = node.NodeName;
            }
            m.header.SenderEndpoint   = LocalEndpoint;
            m.header.ReceiverEndpoint = RemoteEndpoint;

            m.header.SenderNodeID   = node.NodeID;
            m.header.ReceiverNodeID = RemoteNodeID;


            lock (MessageNumberLock)
            {
                m.header.MessageID = MessageNumber;

                MessageNumber = (ushort)((MessageNumber == ((ushort)UInt16.MaxValue)) ? 0 : MessageNumber + 1);
            }

            await node.SendMessage(m, cancel);
        }