BCB6 - Klient Gadu Gadu

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » sobota, 19 grudnia 2009, 00:31

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
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 09:50

A do których konkretnie linii w Twoim kodzie odnoszą się te błędy, gdyż program zdaje się oczekiwać tam jakichś wartości.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » sobota, 19 grudnia 2009, 10:40

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) */
};
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 11:00

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.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
mko000
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez polymorphism » sobota, 19 grudnia 2009, 12:16

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
mko000
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 14:09

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.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
mko000
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » sobota, 19 grudnia 2009, 14:58

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?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez polymorphism » sobota, 19 grudnia 2009, 15:05

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)
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
mko000
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » niedziela, 20 grudnia 2009, 11:49

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");
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez polymorphism » niedziela, 20 grudnia 2009, 12:01

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_?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » niedziela, 20 grudnia 2009, 12:24

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);     */
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez polymorphism » niedziela, 20 grudnia 2009, 12:54

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
mko000
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » niedziela, 20 grudnia 2009, 13:37

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?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez polymorphism » niedziela, 20 grudnia 2009, 13:57

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » niedziela, 20 grudnia 2009, 14:00

Masz na mysli że w tej linijce jest błąd tak?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron