Пример #1
0
        public ClientUpdateReply DoClientUpdate(string[] serverAddresses, int serverPort, int clientNumber, int clientPin, int clientPort)
        {
            if (!ConnectToAnyServer(serverAddresses, serverPort))
            {
                return(null);
            }
            ClientUpdateReply reply = SendClientUpdate(clientNumber, clientPin, clientPort);

            Disconnect();
            return(reply);
        }
Пример #2
0
        /// <summary>
        /// Update own ip-number
        /// </summary>
        /// <param name="number"></param>
        /// <returns>peer or null</returns>
        private ClientUpdateReply SendClientUpdate(int number, int pin, int port)
        {
            Logging.Instance.Log(LogTypes.Debug, TAG, nameof(SendClientUpdate), $"number='{number}'");
            ClientUpdateReply reply = new ClientUpdateReply();

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

            byte[] sendData = new byte[2 + 8];
            sendData[0] = 0x01;             // packet type: client update
            sendData[1] = 0x08;             // length
            byte[] data = BitConverter.GetBytes((UInt32)number);
            Buffer.BlockCopy(data, 0, sendData, 2, 4);
            data = BitConverter.GetBytes((UInt16)pin);
            Buffer.BlockCopy(data, 0, sendData, 6, 2);
            data = BitConverter.GetBytes((UInt16)port);
            Buffer.BlockCopy(data, 0, sendData, 8, 2);

            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[6];
            int    recvLen  = 0;

            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 != 6)
            {
                Logging.Instance.Log(LogTypes.Info, TAG, nameof(SendPeerSearch), $"wrong reply packet size ({recvLen})");
                reply.Error = "error";
                return(reply);
            }

            if (recvData[0] != 0x02)
            {
                // peer not found
                Logging.Instance.Log(LogTypes.Info, TAG, nameof(SendPeerSearch), $"wrong reply packet, type={recvData[0]:X2}");
                reply.Error = "error";
                return(reply);
            }

            reply.Success   = true;
            reply.IpAddress = $"{recvData[2]}.{recvData[3]}.{recvData[4]}.{recvData[5]}";
            reply.Error     = "ok";

            return(reply);
        }