public PeerQueryReply DoPeerQuery(string[] serverAddresses, int serverPort, string number)
        {
            if (!ConnectToAnyServer(serverAddresses, serverPort))
            {
                return(null);
            }
            PeerQueryReply reply = SendPeerQuery(number);

            Disconnect();
            return(reply);
        }
        /// <summary>
        /// Query for number
        /// </summary>
        /// <param name="number"></param>
        /// <returns>peer or null</returns>
        private PeerQueryReply SendPeerQuery(string number)
        {
            Logging.Instance.Log(LogTypes.Debug, TAG, nameof(SendPeerQuery), $"number='{number}'");

            PeerQueryReply reply = new PeerQueryReply();

            if (client == null)
            {
                Logging.Instance.Error(TAG, nameof(SendPeerQuery), "no server connection");
                reply.Error = "no server connection";
                return(reply);
            }

            if (string.IsNullOrEmpty(number))
            {
                reply.Error = "no query number";
                return(reply);
            }

            // convert number to Int32
            number = number.Replace(" ", "");
            if (!UInt32.TryParse(number, out uint num))
            {
                reply.Error = "invalid number";
                return(reply);
            }

            byte[] sendData = new byte[2 + 5];
            sendData[0] = 0x03;             // Peer_query
            sendData[1] = 0x05;             // length
            byte[] numData = BitConverter.GetBytes(num);
            Buffer.BlockCopy(numData, 0, sendData, 2, 4);
            sendData[6] = 0x01;;              // version 1

            try
            {
                stream.Write(sendData, 0, sendData.Length);
            }
            catch (Exception ex)
            {
                Logging.Instance.Error(TAG, nameof(SendPeerQuery), $"error sending data to subscribe server", ex);
                reply.Error = "reply server error";
                return(reply);
            }

            byte[] recvData = new byte[102];
            int    recvLen;

            try
            {
                recvLen = stream.Read(recvData, 0, recvData.Length);
            }
            catch (Exception ex)
            {
                Logging.Instance.Error(TAG, nameof(SendPeerQuery), $"error receiving data from subscribe server", ex);
                reply.Error = "reply server error";
                return(reply);
            }

            if (recvLen == 0)
            {
                reply.Error = $"no data received";
                return(reply);
            }

            if (recvData[0] == 0x04)
            {
                // peer not found
                Logging.Instance.Log(LogTypes.Info, TAG, nameof(SendPeerSearch), $"peer not found");
                reply.Error = $"peer not found {number}";
                reply.Valid = true;
                return(reply);
            }

            if (recvData[0] != 0x05)
            {
                // invalid packet
                Logging.Instance.Log(LogTypes.Error, TAG, nameof(SendPeerSearch), $"invalid packet id ({recvData[0]:X02})");
                reply.Error = $"invalid packet id ({recvData[0]:X02})";
                return(reply);
            }

            if (recvLen < 2 + 0x64)
            {
                Logging.Instance.Log(LogTypes.Error, TAG, nameof(SendPeerSearch), $"received data to short ({recvLen} bytes)");
                reply.Error = $"received data to short ({recvLen} bytes)";
                return(reply);
            }

            if (recvData[1] != 0x64)
            {
                Logging.Instance.Log(LogTypes.Error, TAG, nameof(SendPeerSearch), $"invalid length value ({recvData[1]})");
                reply.Error = $"invalid length value ({recvData[1]})";
                return(reply);
            }

            reply.Data = ByteArrayToPeerData(recvData, 2);

            reply.Valid = true;
            reply.Error = "ok";

            return(reply);
        }