Protokół gg 8.0

0

Witam,
czy mógłby mi ktos pomóc wypełnic strukturę logowania na gg v8.0 bo ja juz próbuje klika dni i nie wiem czemu nie działa! Wysyłam taki pakiet i nie dostaje żadnej odpowiedzi!

Struktura 7.0 działa, dostaje odpowiedz i wszystko ok, ale w niej nie moge zmienic status pewnie przez to że potem używam struktury zmiany statusy z gg 8.0 :(

class GGLogin80OutPacket : IGGPacket
    {
        private int uin;                                         /* numer Gadu-Gadu */
        private byte[] language;                                 /* język: "pl" */
        private byte hash_type = GGConstans.GG_LOGIN_HASH_GG32;  /* rodzaj funkcji skrótu hasła */
        private byte[] hash;                                     /* skrót hasła dopełniony \0 */
        private int status = GGConstans.GG_STATUS_AVAIL;         /* początkowy status połączenia */
        private byte unknown1 = 0x00;        /* 0x00 */
        private int flags = 0;                                   /* flagi (przeznaczenie nieznane) */
        private int features = 0x00000007;                       /* opcje protokołu (0x00000007)*/
        private int local_ip = 0;                                /* lokalny adres połączeń bezpośrednich (nieużywany) */
        private short local_port = 8074;                        /* lokalny port połączeń bezpośrednich (nieużywany) */
        private int external_ip = 0;                         /* zewnętrzny adres (nieużywany) */
        private short external_port = 8074;                     /* zewnętrzny port (nieużywany) */
        private byte image_size = 0;                             /* maksymalny rozmiar grafiki w KB */
        private byte unknown2 = 0xbe;                  /* 0x64 */
        private int version_len = GGConstans.DEFAULT_GG_VERSION;      /* długość ciągu z wersją (0x21) */
        private byte[] version;                                     /* "Gadu-Gadu Client build 8.0.0.7669" (bez \0) */
        private int description_size;                                 /* rozmiar opisu */
        private byte[] description;                                   /* opis (nie musi wystąpić, bez \0) */
        private int time = 0;                                           //dopisac obsluge time

        public GGLogin80OutPacket()
        {
            this.version = new byte[GGConstans.GG_VERSION80.Length];
            for (int i = 0; i < GGConstans.GG_VERSION80.Length ; i++ )
            {
                this.version[i] = Convert.ToByte(GGConstans.GG_VERSION80[i]);
            }
            this.Language = "pl";
        }

        public int Uin
        {
            get
            {
                return uin;
            }
            set
            {
                uin = value;
            }
        }

        public string Language
        {
            get
            {
                try
                {
                    return BitConverter.ToString(language);
                }
                catch (Exception)
                {
                    return "";
                }
            }
            set
            {
                language = new byte[value.Length];
                for (int i = 0; i < value.Length; i++)
                    language[i] = Convert.ToByte(value[i]);
            }
        }

        public byte HashType
        {
            set
            {
                hash_type = value;
            }
            get
            {
                return hash_type;
            }
        }


        public byte[] Hash
        {
            get
            {
                return hash;
            }
            set
            {
                hash = new byte[64];                    // hash o dlugosci 64 bajtow
                for (int i = 0; i < value.Length; i++)  // przepisujemy tylko tyle bajtow ile wyszedl nasz hash
                    hash[i] = value[i];                 // reszta bedzie zerami
            }
        }

        public int Status
        {
            get
            {
                return status;
            }
            set
            {
                status = value;
            }
        }

        public int LocalIp
        {
            get
            {
                return local_ip;
            }
            set
            {
                local_ip = value;
            }
        }


        public short LocalPort
        {
            get
            {
                return local_port;
            }
            set
            {
                local_port = value;
            }
        }

        public int ExternalIp
        {
            get
            {
                return external_ip;
            }
            set
            {
                external_ip = value;
            }
        }

        public short ExternalPort
        {
            get
            {
                return external_port;
            }
            set
            {
                external_port = value;
            }
        }

        public byte ImageSize
        {
            get
            {
                return image_size;
            }
            set
            {
                image_size = value;
            }
        }

        public string Description
        {
            get
            {
                Encoding enc = Encoding.Unicode;
                if (description == null) return "";
                return enc.GetString(Encoding.Convert(Encoding.GetEncoding("windows-1250"), Encoding.Unicode, description));
            }
            set
            {
                description = new byte[value.Length/*+ 1*/];
                Encoding enc = Encoding.GetEncoding("windows-1250");
                byte[] cp1250;
                cp1250 = enc.GetBytes(value);
                for (int i = 0; i < value.Length; i++)
                    description[i] = cp1250[i];
                this.description_size = value.Length;   // podstawiamy wielkosc opisu
            }
        }
        public int Description_size
        {
            get
            {
                try
                {
                    return description_size; // jesli nie została zaalokowana pamięc rzyc wyjatek
                }
                catch (Exception)
                {
                    return 0;       // i zwroc 0 jako wielkosc tablicy
                }
            }
            /*set
            {
                description_size = value;
            }*/
        }

        public int getSize()
        {
            return 9 * sizeof(int) + 3 * sizeof(byte) + 64 * sizeof(byte) + 2 * sizeof(short) * Language.Length + Description.Length + this.version.Length;
        }

}

A wysyłanie na strumien zrealizowałem tak


BinaryWriter bout = new BinaryWriter(outs);

            int i;
            bout.Write(uin);
            for (i = 0; i < this.language.Length; i++)
            {
                outs.WriteByte(this.language[i]);
            }
            bout.Write(hash_type);
            for (i = 0; i < this.hash.Length; i++)
            {
                outs.WriteByte(this.hash[i]);
            }
            bout.Write(status);
            bout.Write(unknown1);
            bout.Write(flags);
            bout.Write(features);
            bout.Write(local_ip);
            bout.Write(local_port);
            bout.Write(external_ip);
            bout.Write(external_port);
            bout.Write(image_size);
            bout.Write(unknown2);
            bout.Write(version_len);
            for (i = 0; i < version.Length; i++)
            {
                outs.WriteByte(version[i]);
            }
            bout.Write(description_size);
            for (i = 0; i < Description.Length; i++)
            {
                bout.Write(Description[i]);
            }
            bout.Write(time);

Pozdrawiam i czekam na jakies pomsły. :)

0

Po pierwsze powinieneś wysyłać cały rekord a nie po elemencie, bo nie wiesz w jaki sposób zostanie zakodowany wysłany (ile zajmie bajtów), nie widzę rónież abyś informowac serwer GG o typie i długości pakietu!

0

Wszystko już napisałem i działa ok

1 użytkowników online, w tym zalogowanych: 0, gości: 1