public bool StartRequest(int retry)
        {
            byte[] packet = new byte[]
            {
                (byte)Code.StartRequest, (byte)(0x02 + retry),
                PacketUtils.RandomByte(), PacketUtils.RandomByte(),
                0x6a, 0x00,
                0x00, 0x00,
                0x00, 0x00,
                0x00, 0x00,
                0x00, 0x00,
                0x00, 0x00,
                0x00, 0x00,
                0x00, 0x00
            };
            Constants.logger.log("Preparing for StartRequest Packet:\n" + BitConverter.ToString(packet));
            byte[] receive = NetworkUtils.SendUDPDatagram(packet);

            if (receive[0] == (byte)Code.StartResponse)
            {
                Constants.logger.log("Received success StartRequest response:\n" + BitConverter.ToString(receive));
                Array.Copy(receive, 4, challenge, 0, 4);
                MD5A = PacketUtils.MD5A((byte)Code.LoginAuth, 0x01, challenge, password);
                MD5B = PacketUtils.MD5B(challenge, password);
                Array.Copy(receive, 20, IP, 0, 4);
                Constants.logger.log("Successfully get IP:\n" + BitConverter.ToString(IP));
                return(true);
            }
            Constants.logger.error("Received failure StartRequest response:\n" + BitConverter.ToString(receive));
            return(false);
        }