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); }