Witam,
od paru dni zająłem się implementacją nowego protokołu GG. Dawniej z implementowałem już stary protokół GG, teraz potrzebna mi w pełni funkcjonalna nowa wersja. Wszystko pięknie fajnie, ale problem jednak w tym, że utknąłem przy pakiecie gg_login80 ( http://toxygen.net/libgadu/protocol/ ). Ogólnie sprawa wygląda tak - do połączenia użyłem winsocka oczywiście, pobieram adres IP z appmsg.gadu-gadu.pl, następnie się łączę, wszystko gra, otrzymuje GG_WELCOME, no i czas na wysłanie pakietu gg_login80, tak też przypisuje wartości pakietowi i wysyłam. W odpowiedzi otrzymuje w GG_HEADER wartość 49, więc podejrzewam, że jest to jakiś nieznany (przynajmniej w opisie owego protokołu) błąd. Stawiam, że problem leży w moim pakiecie GG_LOGIN80, źle wykodzony lub źle przypisany. Wszystko jednak dokładnie sprawdziłem i dalej otrzymuje błąd 49 i postanowiłem poprosić was o pomoc. A więc tak, moje pakiety wyglądają tak:
type
TString64 = array[0..64]of Char;
TString255 = array[0..255]of Char;
TGGHeader = record
_type,
_length:integer;
end;
TGGWelcome = record
_seed:integer;
end;
TGGLogin = record
_number:integer;
_language:array[0..2]of Char;
_hash:shortint;
_hash_result:TString64;
_status,
_flags,
_features,
_local_ip:integer;
_local_port:smallint;
_external_ip:integer;
_external_port:smallint;
_image_size:shortint;
_unknown1:shortint;
_version_len:integer;
_version:TString255;
_description_size:integer;
_description:TString255;
end;
Zaś przypisałem je o tak:
GGHeader._type:=$31;
GGHeader._length:=SizeOf(TGGLogin);
send(Sock,GGHeader,sizeof(TGGHeader),0);
Hash:=gg_sha_hash(GGPassword,GGWelcome._seed);
Hash[20]:='\';
Hash[21]:='0';
with GGLogin do begin
_number := GGNumber;
_language := 'pl';
_hash := $2;
_hash_result:=Hash;
_status:=$5;
_flags:=$23;
_features:=$7;
_local_ip:=0;
_local_port:=0;
_external_ip:=0;
_external_port:=0;
_image_size:=$32;
_unknown1:=$64;
_version_len:=$26;
_version:=GGVersion;
_description_size:=$6;
_description:=GGDesc;
end;
send(Sock,GGLogin,SizeOf(GGLogin),0);
recv(Sock,GGHeader,SizeOf(TGGHeader),0);
if(GGHeader._type=$35)then begin
WriteLn('Zalogowano.');
end else WriteLn(GGHeader._type);
Zmienne GGVersion oraz GGDesc:
GGVersion:TString255 = 'Gadu-Gadu Client build 10.0.0.10450';
GGDesc:TString255 = '!!!!!!';
Ogólnie nie ma sensu bym tutaj wklejał kod do hashowania hasła, bo gdyby hasło byłoby nieprawidłowe otrzymałbym w zwrocie kod 43.
Błagam o pomoc! :)