Próbuje napisać program - komunikator gg, mam jednak problem z zalogowaniem. Zawsze zwraca błąd logowania; struktury które używam wyglądają tak :
#define uchar unsigned char
#define uint unsigned int
#define ubyte uchar
#define ulong unsigned long
#define ushort unsigned short
#pragma pack(push, 1)
typedef struct {
uint type;
uint length;
} GG_HEADER;
struct GG_LOGIN {
uint uin; /* numerek */
ubyte hash_type; /* rodzaj hashowania hasła */
ubyte hash[64]; /* hash hasła dopełniony zerami */
uint status; /* status na dzień„ dobry */
uint version; /* moja wersja klienta */
ubyte dunno1; /* 0x00 */
uint local_ip; /* adres ip */
ushort local_port; /* port, na którym słucham */
uint external_ip; /* zewnętrzny adres ip (???) */
ushort external_port; /* zewnętrzny port (???) */
ushort image_size; /* maksymalny rozmiar grafiki w KiB */
ushort dunno2; /* 0xbe */
};
#pragma pack(pop)
i teraz wysyłam to w ten sposób :
recv(sock,bufor,sizeof(bufor), 0);
gg_server=(GG_HEADER*)bufor;
printf("server: %u %u\n", gg_server->type, gg_server->length);
printf("key : %u\n", *(bufor+8));
char *passwd="HASLO\0";
gg_login.uin=atoi(numer); // numer = "numer gg"
gg_login.hash_type=0x02;
memset(gg_login.hash, 0, 64);
gg_login_hash_sha1(passwd, key, gg_login.hash); // funkcja pobrana z EKG
gg_login.status=0x0003; // status -> away
gg_login.version=0x25; // wersja GG
gg_login.dunno1=0x00; // zawsze zero cokolwiek to jest
gg_login.image_size=0x01; // rozmiar rys. max w Kib
gg_login.dunno2=0xbe; // tez nie wiem co to ale podobno tak ma byc
gg_login.local_ip=inet_addr("moje_ip");
gg_login.external_ip=inet_addr("moje_ip");
gg_login.external_port=htons(jakis_port);
gg_login.local_port=htons(jakis_port);
gg_client.type=0x0019; // logowanie
gg_client.length=sizeof(gg_login); // dlugosc bloku logujacego
memcpy(bufor, &gg_client, sizeof(gg_client)); // kopiuj do bufora
memcpy(bufor+sizeof(gg_client), &gg_login, sizeof(gg_login));
send(sock,bufor,sizeof(gg_client)+sizeof(gg_login),0); // wysylaj
recv(sock,bufor,sizeof(bufor), 0); // odbierz pakiet
gg_server=(GG_HEADER*)bufor; // rzutuj
printf("logowanie : %d\n",gg_server->type); sprawdz czy zalogowano
Niestety to nie działa, nie wiem czemu =/