/// <summary>
        /// Avvia una nuova ricerca in base ai dati di ricerca specificati, creando un nuovo messaggio di richiesta
        /// con un valore di TimeToLive impostato secondo la configurazione e inviandolo a tutti gli attuali vicini
        /// di questo nodo della rete. Nell'eventualità remota che l'identificativo generato per il nuovo messaggio
        /// corrisponda ad uno degli identificativi attualmente presenti nella tabella di inoltro, il messaggio non
        /// viene inviato e questo metodo restituisce false; in caso contrario, restituisce true.
        /// </summary>
        /// <param name="data">I dati che rappresentano la ricerca da effettuare.</param>
        /// <returns>true se richiesta relativa alla ricerca viene inviata ai vicini; in caso contrario, false.</returns>
        public bool CreateNewSearch(SearchData data)
        {
            Guid msgId = Guid.NewGuid();

            lock (m_ForwardingTableLocker)
            {
                if (!m_ForwardingTable.Add(msgId, null, data))
                {
                    return false;   // GUID duplicato
                }
            }

            WriteToLog("Sending query {0}: search data = {1}...", msgId, data);

            QueryData query = new QueryData(msgId, m_MessageInitialTtl, 0) { Options = data.GetSearchOptions() };
            SendQuery(query, null);

            return true;
        }