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/
-
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)) ?
-
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!