Strona 1 z 4

BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 00:31
przez mko000
I napotkałem kolejny problem jakim jest próba zalogowania się na swoje konto. Połączyłem się z serwerem, odebrałem 'seed'. I teraz mam problem z uzupełnieniem struktury logowania. Możecie mi pomoc? Oto kod:
Kod: Zaznacz cały
struct gg_header pakiet;
struct gg_welcome seed;
struct gg_login80 logowanie;
struct gg_recv_msg80 odbior;

// Sprawdzanie połączenia z serwerem gg
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
if(pakiet.type == GG_WELCOME)
        Memo1->Lines->Add("Połączenie z serwerem OK");
else
        Memo1->Lines->Add("Brak połączenia z serwerem" + pakiet.type);

// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
Memo1->Lines->Add(seed.seed);

//Logowanie
logowanie.uin = 18199693;
logowanie.language = "pl";
logowanie.hash_type = 0x01;
logowanie.hash = gg_login_hash("PASSWORD",seed.seed);
logowanie.status = 0x0005;
logowanie.flags = 0x00000001;
logowanie.features = 0x00000007;
logowanie.local_ip = 0;
logowanie.local_port = 0;
logowanie.external_ip = 0;
logowanie.external_port = 0;
logowanie.image_size = 200;
logowanie.unknown2 = 0x64;
logowanie.version_len = 0x21;
logowanie.version = "Gadu-Gadu Client build 8.0.0.7669" ;
logowanie.description_size = sizeof("Aktywny");
logowanie.description = "Aktywny";
logowanie.gg.type = GG_LOGIN80;
logowanie.gg.length = sizeof(logowanie);

}

Kod: Zaznacz cały
[C++ Error] Unit1.cpp(42): E2277 Lvalue required
[C++ Error] Unit1.cpp(44): E2277 Lvalue required
[C++ Error] Unit1.cpp(55): E2277 Lvalue required
[C++ Error] Unit1.cpp(57): E2277 Lvalue required

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 09:50
przez Cyfrowy Baron
A do których konkretnie linii w Twoim kodzie odnoszą się te błędy, gdyż program zdaje się oczekiwać tam jakichś wartości.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 10:40
przez mko000
logowanie.hash = gg_login_hash("PASSWORD",seed.seed);
logowanie.version = "Gadu-Gadu Client build 8.0.0.7669" ;
logowanie.description = sizeof("Aktywny");
logowanie.description = "Aktywny";

Wszędzie tam gdzie jest cudzysłów. Może problemem jest jakaś biblioteka którą trzeba dołączyć?

A to struktura logowania:
#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 (0x00000007)*/
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 unknown2; /* 0x64 */
int version_len; /* długość ciągu z wersją (0x21) */
char version[]; /* "Gadu-Gadu Client build 8.0.0.7669" (bez \0) */
int description_size; /* rozmiar opisu */
char description[]; /* opis (nie musi wystąpić, bez \0) */
};

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 11:00
przez Cyfrowy Baron
Wszędzie tam gdzie jest cudzysłów. Może problemem jest jakaś biblioteka którą trzeba dołączyć?


To zależy jakich wartości oczekuje ta strukruta:

logowanie.hash = AnsiString lub char? :?:
logowanie.version =AnsiString lub char? :?:
logowanie.description = sizeof("Aktywny"); // a co to za bzdura!!! :!: :!: :!:
logowanie.description = AnsiString lub char? :?:

Udziel odpowiedzi na pytania: ? :?:
Jakiego typu są elementy tej struktury?

A to: logowanie.description = sizeof("Aktywny"); to już jakiś absurd! Czy wiesz do czego służy funkcja sizeof? Do określania rozmiaru.

Kod: Zaznacz cały
logowanie.description = sizeof("Aktywny");
logowanie.description = "Aktywny";


Dwa razy nie da się wypełnić tego samego elementu struktury (description) różnymi wartościami. Ten element przyjmie ostatnią podaną wartość, czyli "Aktywny". Poza tym raz podajesz wartość typu int: logowanie.description = sizeof("Aktywny");, a zaraz potem wartosć typu AnsiString lub char: logowanie.description = "Aktywny";

Odnoszę wrażenie, że niewiele wiesz o języku C++. Chyba wybrałeś sobie na początek zbyt trudne zadanie.

Wcześniej napisałeś:

Kod: Zaznacz cały
logowanie.description_size = sizeof("Aktywny");


wiec pewnie za drugim razem coś źle napisałeś.

ale skoro jawnie określasz wartość "Aktywny", to nie ma sensu używanie funkcji sizeof, która się tutaj raczej nie sprawdza.

Kod: Zaznacz cały
logowanie.description_size = 7; // Aktywny = 7


Pokaż konstrukcję struktury gg_login80.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 12:16
przez polymorphism
No przecież podał jej definicję w ostatnim poscie.

Nie wiem czy BCB łyka tablice bez określonego rozmiaru (VC i GCC nie przepuszczają ich), ale najpewniej będzie, jeśli zmienisz nieco gg_login80 w ten sposób:
Kod: Zaznacz cały
struct gg_login80
{
   ...
   char version[0x21];
   ...
   char description[0];
};

wtedy:
Kod: Zaznacz cały
string desc = "przykladowy opis";
vector<char> buf(sizeof(gg_login80) + desc.size());
gg_login80 *gg8 = (gg_login80*)&buf[0];

...

gg8->version_len = 0x21;
memcpy(gg8->version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
gg8->description_size = desc.size();
copy(desc.begin(),desc.end(),gg8->description);

...

gg_login80 nie możesz sobie ot tak po prostu wypełnić, bo jej rozmiar nie jest stały. Dlatego też w przykładzie, który podałem "składam" ją w vectorze. Możesz oczywiście to tego użyć jakiegoś strumienia.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 14:09
przez Cyfrowy Baron
No przecież podał jej definicję w ostatnim poscie.


Nie podał. Edytował post później, po mojej odpowiedzi i dopiero potem to dodał.

Kod: Zaznacz cały
Nie wiem czy BCB łyka tablice bez określonego rozmiaru (VC i GCC nie przepuszczają ich)


C++Builder też tego nie dopuszcza.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 14:58
przez mko000
CyfrowyBaronie strukturę masz podaną w moim 2 poście w tym temacie. Edytowałem to najprawdopodobniej w trakcjie pisania Twojego posta. Co do Twojej medody polymorphizm. Kilka lat temu napisałem właśnie taki komunikator i działało a więc się na tym wzoruje. Teraz chcę znów próbować ponieważ przyda mi się to w projekcie do szkoły. Poszedłem trochę naprzód z kodem dzięki polymorphizm i mam juz taki kod:
Kod: Zaznacz cały
//Logowanie
string opis = "Aktywny";
logowanie.uin = 18199693;
memcpy(logowanie.language,"pl",2);
logowanie.hash_type = 0x01;
logowanie.hash = gg_login_hash("`mko000",seed.seed);
logowanie.status = 0x0003;
logowanie.flags = 0x00000001;
logowanie.features = 0x00000007;
logowanie.local_ip = 0;
logowanie.local_port = 0;
logowanie.external_ip = 0;
logowanie.external_port = 0;
logowanie.image_size = 255;
logowanie.unknown2 = 0x64;
logowanie.version_len = 0x21;
memcpy(logowanie.version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie.description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie.description);
logowanie.gg.type = GG_LOGIN80;
logowanie.gg.length = sizeof(logowanie)- sizeof(gg_header);


Teraz jest tylko błąd przy haśle. Jakiej funkcji mogę użyć aby nie wywalało tego błędu o Lvalue?

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 19 grudnia 2009, 15:05
przez polymorphism
i mam juz taki kod:

Czy definicja logowanie pozostała po staremu? Jeśli tak, to masz błąd. Ma być mniej więcej tak, jak napisałem.

Kod: Zaznacz cały
logowanie.hash = gg_login_hash("`mko000",seed.seed);

gg_login80::hash jest tablicą, a tablic nie kopiuje się poprzez przypisanie (patrz gg_login80::language)

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 11:49
przez mko000
Juz udalo mi sie poprawić strukturę logowania. Nie wyrzuca żadnych błędów tylko teraz mam problem z wysłaniem jej. Jak dobrze rozumiem najpierw mam wysłać pakiet gg_header wraz z długością struktury logowania a następnie strukturę logowania tak? Oto kod: Nie loguje się wgl.
Kod: Zaznacz cały
//Logowanie
string opis = "Aktywny";
char haslo[] = "`mko000";
int hasz = gg_login_hash((unsigned char*)haslo,(unsigned int)seed.seed);
                Memo1->Lines->Add("Hasz:");
                Memo1->Lines->Add(hasz);
logowanie.uin = 18199693;
memcpy(logowanie.language,"pl",2);
logowanie.hash_type = 0x01;
memset(logowanie.hash, 0, 64);
memcpy((void*)logowanie.hash,(void *)&hasz,sizeof(int));
logowanie.status = 0x0003;
logowanie.flags = 0x00000001;
logowanie.features = 0x00000007;
logowanie.local_ip = 0;
logowanie.local_port = 0;
logowanie.external_ip = 0;
logowanie.external_port = 0;
logowanie.image_size = 255;
logowanie.unknown2 = 0x64;
logowanie.version_len = 0x21;
memcpy(logowanie.version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie.description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie.description);
logowanie.gg.type = GG_LOGIN80;
logowanie.gg.length = sizeof(logowanie)- sizeof(gg_header);  ;

ClientSocket1->Socket->SendBuf(&logowanie.gg.type,sizeof(pakiet)) ;
ClientSocket1->Socket->SendBuf(&logowanie,pakiet.length) ;
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
                Memo1->Lines->Add("Logowanie");
if(pakiet.type == GG_LOGIN80_OK)
        Memo1->Lines->Add("OK");
if(pakiet.type == GG_LOGIN_FAILED)
        Memo1->Lines->Add("BŁĄD PODCZAS LOGOWANIA");

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 12:01
przez polymorphism
Czym jest logowanie? Jeśli to jest twoja struktura, to jak wygląda jej definicja i czy jest wyrównana do jednego bajta, tak jak inne struktury gg_?

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 12:24
przez mko000
logowanie jest to struktura gg_login80. Przypisałem ja tak :
Kod: Zaznacz cały
struct gg_login80 logowanie;
Do struktury gg_login80 na końcu dopisałem
Kod: Zaznacz cały
gg_header gg;
Oto cały kod programu:
Unit1.h
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TClientSocket *ClientSocket1;
        TMemo *Memo1;
        TButton *Button1;
        TLabel *Label1;
        void __fastcall Button1Click(TObject *Sender);
private:   // User declarations
public:      // User declarations
        __fastcall TForm1(TComponent* Owner);

struct gg_header {
   int type;   /* typ pakietu */
   int length;   /* długość reszty pakietu */
};
struct gg_welcome {
   int seed;   /* ziarno */
};
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 (0x00000007)*/
        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 unknown2;        /* 0x64 */
        int version_len;      /* długość ciągu z wersją (0x21) */
        char version[0x21];       /* "Gadu-Gadu Client build 8.0.0.7669" (bez \0) */
        int description_size; /* rozmiar opisu */
        char description[];   /* opis (nie musi wystąpić, bez \0) */
        gg_header gg;
};
struct gg_login80_ok {
   int unknown1;   /* 01 00 00 00 */
};
struct gg_send_msg80 {
   int recipient;      /* numer odbiorcy */
   int seq;      /* numer sekwencyjny */
   int clas;      /* klasa wiadomości */
   int offset_plain;   /* położenie treści czystym tekstem */
   int offset_attributes;   /* położenie atrybutów */
   char html_message[];   /* treść w formacie HTML (zakończona \0) */
   char plain_message[];   /* treść czystym tekstem (zakończona \0) */
   char attributes[];   /* atrybuty wiadomości */
};
struct gg_recv_msg80 {
   int sender;      /* numer nadawcy */
   int seq;      /* numer sekwencyjny */
   int time;      /* czas nadania */
   int clas;      /* klasa wiadomości */
   int offset_plain;   /* położenie treści czystym tekstem */
   int offset_attributes;   /* położenie atrybutów */
   char html_message[];   /* treść w formacie HTML (zakończona \0) */
   char plain_message[];   /* treść czystym tekstem (zakończona \0) */
   char attributes[];   /* atrybuty wiadomości */
};
int gg_login_hash(unsigned char *password, unsigned int seed)
{
   unsigned int x, y, z;

   y = seed;

   for (x = 0; *password; password++) {
      x = (x & 0xffffff00) | *password;
      y ^= x;
      y += x;
      x <<= 8;
      y ^= x;
      x <<= 8;
      y -= x;
      x <<= 8;
      y ^= x;

      z = y & 0x1f;
      y = (y << z) | (y >> (32 - z));
   }

   return y;
}

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <string>

using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

#define GG_WELCOME 0x0001
#define GG_LOGIN80 0x0031
#define GG_LOGIN80_OK 0x0035
#define GG_LOGIN_FAILED 0x0009
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
struct gg_header pakiet;
struct gg_welcome seed;
struct gg_login80 logowanie;
struct gg_recv_msg80 odbior;

// Sprawdzanie połączenia z serwerem gg
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
                Memo1->Lines->Add("Połączenie z serwerem:");
if(pakiet.type == GG_WELCOME)
        Memo1->Lines->Add("OK");
else
        Memo1->Lines->Add("BRAK" + pakiet.type);

// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
                Memo1->Lines->Add("Ziarno:");
                Memo1->Lines->Add(seed.seed);
//Logowanie
string opis = "Aktywny";
char haslo[] = "`mko000";
int hasz = gg_login_hash((unsigned char*)haslo,(unsigned int)seed.seed);
                Memo1->Lines->Add("Hasz:");
                Memo1->Lines->Add(hasz);
logowanie.uin = 18199693;
memcpy(logowanie.language,"pl",2);
logowanie.hash_type = 0x01;
memset(logowanie.hash, 0, 64);
memcpy((void*)logowanie.hash,(void *)&hasz,sizeof(int));
logowanie.status = 0x0003;
logowanie.flags = 0x00000001;
logowanie.features = 0x00000007;
logowanie.local_ip = 0;
logowanie.local_port = 0;
logowanie.external_ip = 0;
logowanie.external_port = 0;
logowanie.image_size = 255;
logowanie.unknown2 = 0x64;
logowanie.version_len = 0x21;
memcpy(logowanie.version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie.description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie.description);
logowanie.gg.type = GG_LOGIN80;
logowanie.gg.length = sizeof(logowanie)- sizeof(gg_header);  ;

ClientSocket1->Socket->SendBuf(&logowanie.gg.type,sizeof(pakiet)) ;
ClientSocket1->Socket->SendBuf(&logowanie,pakiet.length) ;
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
                Memo1->Lines->Add("Logowanie");
if(pakiet.type == GG_LOGIN80_OK)
        Memo1->Lines->Add("OK");
if(pakiet.type == GG_LOGIN_FAILED)
        Memo1->Lines->Add("BŁĄD PODCZAS LOGOWANIA");





}
//---------------------------------------------------------------------------

  //logowanie.language = "pl";
//logowanie.version = "Gadu-Gadu Client build 8.0.0.7669" ;
//logowanie.description;
//ClientSocket1->Socket->ReceiveBuf(&pakiet,10);
/*ClientSocket1->Socket->SendBuf(&logowanie,sizeof(logowanie)) ;
if(pakiet.type == GG_LOGIN80_OK)
        Memo1->Lines->Add("GG_LOGIN80_OK");
if(pakiet.type == GG_LOGIN_FAILED)
        Memo1->Lines->Add("GG_LOGIN_FAILED " + pakiet.type);     */

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 12:54
przez polymorphism
Do struktury gg_login80 na końcu dopisałem

A po co? Przecież to nic nie wnosi, poza bajzlem.



Wszystkie struktury gg_ powinny być wyrównane do jednego bajta. U ciebie tego nie ma, a to poważny błąd.

Kod: Zaznacz cały
#pragma pack(push, 1)

/* tu definicje wszystkich struktur */

#pragma pack(pop)




Kod: Zaznacz cały
struct gg_login80
{
     ...
     char description[];
};

...

struct gg_login80 logowanie;

...

copy(opis.begin(),opis.end(),logowanie.description);

Pisałem, że tak nie możesz tego zrobić - description ma rozmiar równy zero. Jak to powinno wyglądać podałem w pierwszym poscie.

___
p.s. struct przy definicji zmiennej jest zupełnie zbędne w C++, to naleciałość z C.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 13:37
przez mko000
Ok poprawiłem kod:
Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <string>

using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

#define GG_WELCOME 0x0001
#define GG_LOGIN80 0x0031
#define GG_LOGIN80_OK 0x0035
#define GG_LOGIN_FAILED 0x0009
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
gg_header pakiet;
gg_welcome seed;
gg_login80 logowanie;
gg_recv_msg80 odbior;

// Sprawdzanie połączenia z serwerem gg
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
                Memo1->Lines->Add("Połączenie z serwerem:");
if(pakiet.type == GG_WELCOME)
        Memo1->Lines->Add("OK");
else
        Memo1->Lines->Add("BRAK" + pakiet.type);

// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
                Memo1->Lines->Add("Ziarno:");
                Memo1->Lines->Add(seed.seed);
//Logowanie
string opis = "Aktywny";
char haslo[] = "`mko000";
int hasz = gg_login_hash((unsigned char*)haslo,(unsigned int)seed.seed);
                Memo1->Lines->Add("Hasz:");
                Memo1->Lines->Add(hasz);
logowanie.uin = 18199693;
memcpy(logowanie.language,"pl",2);
logowanie.hash_type = 0x01;
memset(logowanie.hash, 0, 64);
memcpy((void*)logowanie.hash,(void *)&hasz,sizeof(int));
logowanie.status = 0x0003;
logowanie.flags = 0x00000001;
logowanie.features = 0x00000007;
logowanie.local_ip = 0;
logowanie.local_port = 0;
logowanie.external_ip = 0;
logowanie.external_port = 0;
logowanie.image_size = 255;
logowanie.unknown2 = 0x64;
logowanie.version_len = 0x21;
memcpy(logowanie.version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie.description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie.description);
pakiet.type = GG_LOGIN80;
pakiet.length = sizeof(logowanie);  ;

ClientSocket1->Socket->SendBuf(&pakiet.type,sizeof(logowanie)) ;
ClientSocket1->Socket->SendBuf(&logowanie,pakiet.length) ;
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
                Memo1->Lines->Add("Logowanie");
if(pakiet.type == GG_LOGIN80_OK)
        Memo1->Lines->Add("OK");
if(pakiet.type == GG_LOGIN_FAILED)
        Memo1->Lines->Add("BŁĄD PODCZAS LOGOWANIA");





}
//---------------------------------------------------------------------------

  //logowanie.language = "pl";
//logowanie.version = "Gadu-Gadu Client build 8.0.0.7669" ;
//logowanie.description;
//ClientSocket1->Socket->ReceiveBuf(&pakiet,10);
/*ClientSocket1->Socket->SendBuf(&logowanie,sizeof(logowanie)) ;
if(pakiet.type == GG_LOGIN80_OK)
        Memo1->Lines->Add("GG_LOGIN80_OK");
if(pakiet.type == GG_LOGIN_FAILED)
        Memo1->Lines->Add("GG_LOGIN_FAILED " + pakiet.type);     */

Unit1.h
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TClientSocket *ClientSocket1;
        TMemo *Memo1;
        TButton *Button1;
        TLabel *Label1;
        void __fastcall Button1Click(TObject *Sender);
private:   // User declarations
public:      // User declarations
        __fastcall TForm1(TComponent* Owner);
#pragma pack(push, 1)
struct gg_header {
   int type;   /* typ pakietu */
   int length;   /* długość reszty pakietu */
};
struct gg_welcome {
   int seed;   /* ziarno */
};
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 (0x00000007)*/
        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 unknown2;        /* 0x64 */
        int version_len;      /* długość ciągu z wersją (0x21) */
        char version[0x21];       /* "Gadu-Gadu Client build 8.0.0.7669" (bez \0) */
        int description_size; /* rozmiar opisu */
        char description[100];   /* opis (nie musi wystąpić, bez \0) */
};
struct gg_login80_ok {
   int unknown1;   /* 01 00 00 00 */
};
struct gg_send_msg80 {
   int recipient;      /* numer odbiorcy */
   int seq;      /* numer sekwencyjny */
   int clas;      /* klasa wiadomości */
   int offset_plain;   /* położenie treści czystym tekstem */
   int offset_attributes;   /* położenie atrybutów */
   char html_message[0];   /* treść w formacie HTML (zakończona \0) */
   char plain_message[0];   /* treść czystym tekstem (zakończona \0) */
   char attributes[0];   /* atrybuty wiadomości */
};
struct gg_recv_msg80 {
   int sender;      /* numer nadawcy */
   int seq;      /* numer sekwencyjny */
   int time;      /* czas nadania */
   int clas;      /* klasa wiadomości */
   int offset_plain;   /* położenie treści czystym tekstem */
   int offset_attributes;   /* położenie atrybutów */
   char html_message[0];   /* treść w formacie HTML (zakończona \0) */
   char plain_message[0];   /* treść czystym tekstem (zakończona \0) */
   char attributes[0];   /* atrybuty wiadomości */
};
#pragma pack(pop)
int gg_login_hash(unsigned char *password, unsigned int seed)
{
   unsigned int x, y, z;

   y = seed;

   for (x = 0; *password; password++) {
      x = (x & 0xffffff00) | *password;
      y ^= x;
      y += x;
      x <<= 8;
      y ^= x;
      x <<= 8;
      y -= x;
      x <<= 8;
      y ^= x;

      z = y & 0x1f;
      y = (y << z) | (y >> (32 - z));
   }

   return y;
}

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Lecz nadal mi sie nie loguje. Połączenie z serwerem ok, ziarno ok, przelicza mi hasz ale nie loguje. Zapewne mam błąd w socketach tylko jak to naprawić? Pierw mam wysłać gg_header z wielkością pakietu logowanie a później gg_login80 z długością pakietu?

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 13:57
przez polymorphism
Kod: Zaznacz cały
ClientSocket1->Socket->SendBuf(&pakiet.type,sizeof(logowanie)) ;

To...

Kod: Zaznacz cały
char description[100];

Nie wiem czy to dobry pomysł, żeby wielkość pakietu różniła się od rzeczywistej wielkości.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: niedziela, 20 grudnia 2009, 14:00
przez mko000
Masz na mysli że w tej linijce jest błąd tak?