Działający klient Gadu-Gadu w C#

0

Czy ktoś ma może działający klient gg? Chociaż logowanie...
Zacząłem aktualizować dotgadu (https://code.google.com/p/dotgadu/), serwer ładnie zwraca seeda, ale w żaden sposób nie potrafię zmusić go żeby odpowiedział cokolwiek na pakiet z logowaniem...
Z góry dziękuje za pomoc

1

Ja ostatnio pisałem pod protokół znajdujący się na http://toxygen.net/libgadu/protocol/. Działają nowe numery.
Jest logowanie, zmiana statusu, wysyłanie oraz odbieranie wiadomości.
Link: https://www.amazon.com/clouddrive/share?s=ofUdTG3gT0IsBJ25jaGgzo

@Edit A no i zmiana opisu nie działa. Pewnie jakiś głupi błąd walnąłem :)

0

niby dziala ale tak nie do konca. Aqq niewywaliło mi multilogowania :P, opis natomiast zmienia bez problemu a nie zmienia mi statusu :P

1

A no bo nie ma multilogowania :P Trzeba by dorobić.
Dałem source więc możesz modyfikować.

@Edit Pamiętaj, żeby wysłać odpowiednią flagę przy logowaniu jak już będziesz robić multilogowanie.

0

bardzo Ci dziękuje, jakoś już sobie poradze mając taki base. Temat do zamknięcia

0

odświeżam znowu temat bo mam drobny temat z pobieraniem dodatkowych informacji o kontaktach.
Na podstawie http://toxygen.net/libgadu/protocol/#ch1.5 wysyłam taki pakiet:

         public static byte[] WriteContacts(short count) 
        {
            using (PacketWriter writer = new PacketWriter())
            {
                foreach (var k in Global.kontakty)
                {
                    writer.Write(k.Numer);
                    writer.Write(k.Flag);
                }
                return BuildHeader(Container.GG_NOTIFY_LAST, writer.Data);
            }
        } 

a zwrot czytam:

             using (PacketReader reader = new PacketReader(data))
            {
                if (data.Length > 0)
                {
                        // zakladajac, ze opis to ostatnia 'czesc pakietu'
                        //while (reader.PeekChar().ToString() != "\0") //tutaj nie 
                        //{
                        while (true)
                        {
                            try
                            {
                                int uin = reader.ReadInt32();		/* numer Gadu-Gadu kontaktu */
                                int status = reader.ReadInt32();		/* status */
                                int features = reader.ReadInt32();		/* opcje protokołu (patrz GG_LOGIN80) */
                                int remote_ip = reader.ReadInt32();		/* adres IP bezpośrednich połączeń (nieużywane) */
                                short remote_port = reader.ReadInt16();	/* port bezpośrednich połączeń (nieużywane) */
                                char image_size = reader.ReadChar();	/* maksymalny rozmiar obrazków w KB */
                                char unknown1 = reader.ReadChar();		/* 0x00 */
                                int flags = reader.ReadInt32();		/* flagi połączenia (patrz GG_LOGIN80) */
                                int description_size = reader.ReadInt32();	/* rozmiar opisu */
                                char[] description = reader.ReadChars(description_size);	/* opis (nie musi wystąpić, bez \0) */
                                Global.kontakty.Find(c => c.Numer == uin).Opis = new string(description);
                                Global.kontakty.Find(c => c.Numer == uin).Status = (byte)status;
                            }
                            catch (Exception e) { System.Windows.MessageBox.Show(e.ToString()); break; }
                        }
                        //}
                }
            }

Niestety pakiet zwrotny jest jakiś urwany. Wysyłam informacje o 270 kontaktach a 4 kontakt przychodzi błędny. Numer jest ok, status mi zwraca 22 chociaż jest niedostępny, features etc az do flags nie ma w ogole, description_size jest natomiast zbyt dlugie i w zasadzie wywala error pod koniec czytania z powodu swojej "urwanosci", następnych kontaktów już nie ma. Ktoś ma pomysł co mogę robić źle?

Nie wiem czy moge pisac tutaj czy mam nowy temat zalozyc, nie znam zwyczajow tego forum

0

Opis protokołu nie jest już taki świeży, a wiem, że GG majstruje w swoim protokole i gdy sam pisałem ostatnio nawet klienta to też niektóre rzeczy nie działały po prostu. Choć to niekoniecznie powód twojego problemu.

0

Może tak:

if(description_size > 0)
{
  char[] description = reader.ReadChars(description_size); 
  Global.kontakty.Find(c => c.Numer == uin).Opis = new string(description);
}  else Global.kontakty.Find(c => c.Numer == uin).Opis = string.Empty; 

Poza tym na początku opisu protokołu jest:

Przy opisie struktur, założono, że char ma rozmiar 1 bajtu, short 2 bajtów, int 4 bajtów, long long 8 bajtów, wszystkie bez znaku.

Więc:
do char użyj byte lub char,
do short użyj ushort,
do int użyj uint,
do long long użyj ulong.
To akurat nie powinno mieć żadnego wpływu na twój błąd, ale lepiej używać typów bez znaku skoro tak napisali w opisie :)

0

dzięki, niestety to nie ma wpływu na urwany pakiet :P

0

Poczytaj o protokole XMPP.

0

fajnie fajnie, tylko jak to się ma do uszkodzonego pakietu? Nie bardzo jest co odczytywac z pakietu ktory jest przerwany op 460 bajtach i NIE JEST pakietem xmpp

0
qwertty43 napisał(a):

Poczytaj o protokole XMPP.

Co ma XMPP do customowego protokołu Gadu-Gadu? :|

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