[C++] Protokół Gadu-Gadu - problem z zalogowaniem się, prośba o wytłumaczenie prostych rzeczy.

0

Witam,
Od razu mówię, że nie jestem jakiś super zaawansowany w pisaniu programów sieciowych, więc proszę o wyrozumiałość.
Korzystam z tego: http://toxygen.net/libgadu/protocol/

  1. Używam kompilatora Dev-Cpp, w protokole jest napisane, że należy użyć: attribute ((packed)) za deklaracją każdej struktury, lub: #pragma pack(push, 1)/* deklaracje */ #pragma pack(pop). Więc powinienem wpisać attribute ((packed)) ?

  2. Pobieram ziarno, hashuje SHA-1, ale nie mogę dostać pakietu 0x0035 (GG_LOGIN80_OK) - nic nie dostaję.
    Daje tutaj kawałek kodu, jeśli trzeba będzie to wkleję wszystko (nie ma tego dużo do analizowania).

Tutaj moja struktura którą wysyłam:

#define GG_LOGIN80 0x0031
struct gg_login80 {
        int uin;              /* numer Gadu-Gadu */
        char language[2];     /* język: "pl" */
        char hash_type;       /* rodzaj funkcji skrótu hasła */
        char hash[64];        /* skrót hasła dopełniony \0 */
        int status;           /* początkowy status połączenia */
        int flags;            /* początkowe flagi połączenia */
        int features;         /* opcje protokołu (0x00000367)*/
        int local_ip;         /* lokalny adres połączeń bezpośrednich (nieużywany) */
        short local_port;     /* lokalny port połączeń bezpośrednich (nieużywany) */
        int external_ip;      /* zewnętrzny adres (nieużywany) */
        short external_port;  /* zewnętrzny port (nieużywany) */
        char image_size;      /* maksymalny rozmiar grafiki w KB */
        char unknown1;        /* 0x64 */
        int version_len;      /* długość ciągu z wersją (0x23) */
        char version[];       /* "Gadu-Gadu Client build 10.0.0.10450" (bez \0) */
        int description_size; /* rozmiar opisu */
        char description[];   /* opis (nie musi wystąpić, bez \0) */
}login80;

Tutaj proces wysyłania i uzupełnienie struktury:

char* password = "TutajJestMojeHaslo";
    
    char *hash ;
    hash = gg_sha_hash(password,welcome.seed);
    cout << "[ ] Hash hasla: " << hash << endl;
    
    login80.uin = 32134348;
    strcpy(login80.language,"pl");
    login80.hash_type = 0x02;
    strcpy(login80.hash,hash);
    login80.status = 0x0002;
    login80.flags = 0;
    login80.features = 0x00000367;
    login80.local_ip = 0;
    login80.local_port = 0;
    login80.external_ip = 0;
    login80.external_port = 0;
    login80.image_size = 64;
    login80.unknown1 = 0x64;
    login80.version_len = 0x23;
    strcpy(login80.version,"Gadu-Gadu Client build 10.0.0.10450");
    
    header.type = GG_LOGIN80;
    header.length = sizeof(login80);
    if(send(klient,(char*)&header,sizeof(header),0))
    {
       clear(&header);
       //cout << "Wysylam header..." << endl;
       if(send(klient, (char*)&login80, sizeof(login80), 0))
       {
          clear(&header);
          cout << "Wyslano dane!\n";
          if(recv(klient,(char*)&header,sizeof(header),0)) //XXXXXXXXXXXXXXXXXXXXXX
          {
             if(header.type == GG_LOGIN80_OK)
             {
                
                    cout<<"login ok\n";
             }
              
             if(header.type == GG_LOGIN80_FAILED)
             {
                    cout<<"login failed\n";
             }
          }
          else
          cout << "Nie można pobrac danych!\n";
       }
       else
       {
          cout << "Nie wyslano danych!\n";
       }
       
    } 

Nie pobiera mi danych w miejscu zakreślonym w komentarzu znakami X.
Dziękuję za wszelką pomoc.
Pozdrawiam!

1
bono3565 napisał(a)

Używam kompilatora Dev-Cpp

Nie. Używasz "dupiatego" IDE, którym jest Dev-Cpp. Naucz się, że IDE, a kompilator to nie to samo. Używasz mingw dołączonego do tego ustrojstwa starego. To jest raz.
Dwa...
http://4programmers.net/C_sharp/Gotowce/Prosty_klient_GG
http://4programmers.net/Forum/C_i_C++/140508-Protok%C3%B3l_gg?start=10
http://4programmers.net/Szukaj?q=gg+zalogowanie
http://www.google.pl/
...
i mogę tak bez końca ale to ty masz problem i to ty powinieneś wiedzieć jak znaleźć jego rozwiązanie ( przynajmniej dojść do tego ), a nie walić od razu na forum bez szukania odpowiedzi.

0

Kolego, nie "walę" od razu na forum... Sporo przesiedziałem przeczesując internet. Większość problemów staram się rozwiązać samemu, lecz w tym przypadku mnie już wpienia rozwiązując ten problem 2 dni - jestem bezradny. Linki które mi podałeś przeczytałem zanim tutaj napisałem. W linku Klient jest napisany w C# i jest tam struktura wg. starego protokołu.

Jak wysyłałem starą strukturę gg_login60, gg_login70 to wszystko ładniutko działało, ale teraz nie dostaję odpowiedzi wysyłając tą "nową" strukturę zawartą w zmienionym protokole i czekam na pomoc kogoś mądrzejszego ode mnie.
Pozdrawiam.

0

Wyrównałeś struktury do bajta?

0

Tak.

0

"Kolego", a wiesz co to jest open source? Wiesz ile jest DZIAŁAJĄCYCH klientów gg na open source'ie? Dużo. Gdybym to ja miał taki problem to pokusiłbym się o sprawdzenie ich źródła i zobaczenie w jaki sposób twórcy tych programów uzupełnili dane struktury i jak sobie poradzili z twoim problemem. Nie mów mi tylko, że źródła też przeglądałeś i nic nie znalazłeś bo nie uwierzę.

0

Heh, dopiero zauważyłem:

struct gg_login80 
{
	...
	char version[]; //<--- to musi mieć konkretny rozmiar (0x23). 
};

...

strcpy(login80.version,"Gadu-Gadu Client build 10.0.0.10450");
0

O, dzięki wielkie :) 3 dni się w to gapiłem i nie zauważyłem.
Pozdro :)

0

Gdybyś kompilował w trybie pedantycznej zgodności ze standardem (-ansi -pedantic) to byś takich problemów nie miał, bo kompilator nie pozwoliłby Ci tego nawet skompilować:

struct Foo {
    char str[];
}
//...
// cpp_main.cpp:5:14: error: ISO C++ forbids zero-size array 'str'

Gdzie podłapałeś taką składnię?

Kod do komentarza:

struct Hello {
    int c;
    char str[];
    //test.c:5:10: error: flexible array member not at end of struct
    float f;
};

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