BCB6 - Klient Gadu Gadu

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

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez polymorphism » niedziela, 20 grudnia 2009, 14:03

Tak.
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: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

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

Nie mogę pojąć co mam nie tak. Wzoruje sie na tym kodzie:
Kod: Zaznacz cały
gg_login80* login = new gg_login80;
                login->header.type = GG_LOGIN80;
                login->header.length = sizeof(gg_login80) - sizeof(gg_header);
                login->uin = ggNumber;
                login->language = "pl";
                login->hash_type = GG_LOGIN_HASH_GG32;
                login->hash = gg_login_hash(ggPassword, GGwelcome.seed);
                login->status = GG_STATUS_AVAIL;
                login->flags = 0;
                login->features = 0x00000007;
                login->local_ip = 0;
                login->local_port = 0;
                login->external_ip = 0;
                login->external_port = 0;
                login->image_size = 255;
                login->unknown2 = 0x64;
                login->version = "Gadu-Gadu Client build 8.0.0.7669";
                login->version_len = sizeof(login->version);
                login->description_size = 0;
                login->description;
                iResult = send(realSocket, (char*)&login, sizeof(login), 0);

wszystko tak samo tylko tu jest na socketach a nie na komponencie z BCB. W czym jest problem ? Moze jeszcze jakas podpowiedz?
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, 23:51

Wzoruje sie na tym kodzie:

Ten kod ma błędy, o których była już mowa, więc lepiej nie wzoruj się na nim. Najciekawsze jest to, że dostałeś kod z vectorem, który z dużym prawdopodobieństwem zadziała. Ale nie, uparłeś się, że zrobisz to po swojemu. No i robisz, efekty widać...

Czytałeś w ogóle opis protokołu GG?
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: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » poniedziałek, 21 grudnia 2009, 18:07

Tak czytałem protokół gg i to parę razy. Wzorowałem się na tamtym kodzie bo jest dla mnie bardziej zrozumiały a autor pisze ze zalogował się. Jednak mi nie wychodzi i posłucham Twojej rady aby użyć vector. Jako że nie mam takiego ogromu wiedzy lecz staram się uczyć wszystkiego dokładnie poczytałem trochę o tej funkcji. I mam parę pytań.
1. Napisałeś tak:
Kod: Zaznacz cały
vector<char> buf(sizeof(gg_login80) + opis.size());

jak się domyślam w vectorze buf przetrzymywany będzie rozmiar struktury gg_login80. Dlaczego składasz do char zamiast do int skoro wielkość do serwera należy wysłać właśnie w takiej zmiennej?
2. Zapis:
Kod: Zaznacz cały
gg_login80 *gg8 = (gg_login80*)&buf[0];
do czego on służy ?
3. Czy należy składać do vectora wszystkie warości występujące w strukturze logowania ? (długość loginu, hasła, pl, i wersji? )
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 » poniedziałek, 21 grudnia 2009, 18:55

Wzorowałem się na tamtym kodzie bo jest dla mnie bardziej zrozumiały a autor pisze ze zalogował się.

Zalogować to może się zalogował, ale na pewno nie przy użyciu tamtego kodu, ponieważ zawiera błędy składniowe, uniemożliwiające poprawną kompilację.

poczytałem trochę o tej funkcji.

To nie jest funkcja, tylko klasa szablonowa. Taka obiektowa wersja tablicy dynamicznej.

jak się domyślam w vectorze buf przetrzymywany będzie rozmiar struktury gg_login80.

Nie, w buf przechowywana będzie cała struktura gg_login80 i opis (gg_login80::description).

Dlaczego składasz do char zamiast do int skoro wielkość do serwera należy wysłać właśnie w takiej zmiennej?

To w ogóle nie ma związku z tym, w jakim typie wysyłam wielkość pakietu. A char dlatego, że rezerwuje odpowiednią ilość bajtów dla pakietu GG_LOGIN80. W sumie mogłem jeszcze dodać gg_header, wszystko byłoby w jednym bloku pamięci, gotowe do wysłania.

do czego on służy ?

Rzutuje wskaźnik char* na wskaźnik gg_login80* po to, żeby wypełnić tę strukturę (która de facto rezyduje w wektorze).

Można też tak zapisać:
Kod: Zaznacz cały
gg_login80 *gg8 = (gg_login80*)&buf.front();


Na pytanie 3 w zasadzie odpowiada odpowiedź na pytanie 2, ale mogę odpowiedzieć pytaniem: a czy widzisz gdzieś w moim kodzie, żebym dodawał np. version lub version_len do wektora? A może po prostu uzupełniam pola struktury poprzez wskaźnik gg8?
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: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » poniedziałek, 21 grudnia 2009, 21:29

Nie, w buf przechowywana będzie cała struktura gg_login80 i opis (gg_login80::description).

Teraz już jestem zamotany.
Kod: Zaznacz cały
vector<char> buf(sizeof(gg_login80) + opis.size());

Przecież w przykładzie który podałeś buf ma w nawiasie rozmiar struktury logowania i opisu a nie całą strukturę. Mylę się?
Kod: Zaznacz cały
//Logowanie
string opis = "Aktywny";
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));
gg_login80 *logowanie = (gg_login80*)&buf[0];

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(buf);

ClientSocket1->Socket->SendBuf(logowanie,sizeof(buf)) ;

Jak dodać do logowania gg_header ? Jak próbuje + lub & wyskakuja błędy. I czy wogóle jest ok ?

Ps. Dzięki za tak dużą pomoc. Wydawało się to dużo prostsze gdy patrzyłem na kody innych użytkowników.
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 » poniedziałek, 21 grudnia 2009, 21:58

Przecież w przykładzie który podałeś buf ma w nawiasie rozmiar struktury logowania i opisu a nie całą strukturę. Mylę się?

Nie, nie mylisz się. Tylko jakbyś przejrzał dokumentację, to wiedziałbyś, co ten zapis znaczy. A znaczy tyle, że przy tworzeniu buf ustalam jego wielkość w charach, czyli w bajtach.

Kod: Zaznacz cały
pakiet.length = sizeof(buf);

Błąd. buf jest obiektem klasy vector, to nie jest tablica statyczna, POD, czy inny typ skalarny, żebyś mógł go sobie bezkarnie mierzyć sizeof'em. Od tego jest metoda size. Mówię: zajrzyj do dokumentacji!

Kod: Zaznacz cały
vector<char> buf(... + sizeof(gg_header));

Po co sizeof(gg_header), przecież i tak nie robisz z niego pożytku? Jeśli już, to:
Kod: Zaznacz cały
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));

gg_header* gghdr = (gg_header*)&buf[0];
gg_login80* logowanie = (gg_login80*)(gghdr + 1);

gghdr.type = GG_LOGIN80;
gghdr.length = sizeof(gg_login80) + opis.size();

...

ClientSocket1->Socket->SendBuf(&buf[0],buf.size());

w buf składam cały pakiet logujący.



Brutalna prawda jest taka, że zabierasz się za coś, co wymaga większych umiejętności programistycznych niż obecnie posiadasz. Niestety...
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: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » poniedziałek, 21 grudnia 2009, 22:37

Dziękuje za szybkie odpowiedzi. Lecz problem jest nadal. Ciągle otrzymuje pakiet GG_WELCOME. Zamiast GG_LOGIN80_OK. Czy problemem jest błędnie wypełniona struktura logowania?
Kod: Zaznacz cały
Memo1->Lines->Clear();
gg_welcome seed;
gg_header pakiet;
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");
        Memo1->Lines->Add(pakiet.type);  }
//
////////////////////////////////////////////////////////////////////////////////
// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
                Memo1->Lines->Add("Ziarno:");
                Memo1->Lines->Add(seed.seed);
////////////////////////////////////////////////////////////////////////////////
//Logowanie
string opis = "Aktywny";
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));

gg_header* gghdr = (gg_header*)&buf[0];
gg_login80* logowanie = (gg_login80*)(gghdr + 1);

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);

gghdr->type = GG_LOGIN80;
gghdr->length = sizeof(gg_login80) + opis.size();

ClientSocket1->Socket->SendBuf(&buf[0],buf.size());

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


Mając kontakt z takimi osobami jak Ty polymorphizm zdaję sobie sprawę ile jeszcze nauki przede mną. I podziwiam Twoje zdolności programistyczne. Obym choć w małym stopniu posiadł taką wiedzę.
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 » poniedziałek, 21 grudnia 2009, 23:08

Kod: Zaznacz cały
ClientSocket1->Socket->ReceiveBuf(&gghdr,sizeof(gghdr));

gghdr jest wskaźnikiem, więc oba parametry są złe.

p.s. zakładam, że gg_login80 jest taka jak zasugerowałem w tym poscie.

Obym choć w małym stopniu posiadł taką wiedzę.

Zaopatrz się w jakąś dobrą książkę od C++ i przerób ją porządnie. Zobaczysz, że to o czym piszę to groźnie wyglądające banały, sprawy bardzo podstawowe.
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: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » poniedziałek, 21 grudnia 2009, 23:35

Tak. Nie odbiera mi żadnego pakietu. Oto cały kod:
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

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

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_welcome seed;
gg_header pakiet;
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");
        Memo1->Lines->Add(pakiet.type);  }
//
////////////////////////////////////////////////////////////////////////////////
// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
                Memo1->Lines->Add("Ziarno:");
                Memo1->Lines->Add(seed.seed);
////////////////////////////////////////////////////////////////////////////////
//Logowanie
string opis = "Aktywny";

vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));
gg_header* gghdr = (gg_header*)&buf[0];
gg_login80* logowanie = (gg_login80*)(gghdr + 1);

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);

gghdr->type = GG_LOGIN80;
gghdr->length = sizeof(gg_login80) + opis.size();

ClientSocket1->Socket->SendBuf(&buf[0],buf.size());

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

void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClientSocket1->Active = false;
ClientSocket1->Active = true;
Memo1->Clear();
}
//---------------------------------------------------------------------------


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;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(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[255];   /* 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

Teraz odbiór pakietu jest taki sam jak na początku programu i nie odbiera nic. Czyli błąd jest po stronie struktury 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 » wtorek, 22 grudnia 2009, 10:18

Żartujesz sobie? Co to jest:
Kod: Zaznacz cały
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
...

if(gghdr->type == GG_LOGIN80_OK)
...
if(gghdr->type == GG_LOGIN_FAILED)
...
:?:



Kod: Zaznacz cały
struct gg_login80
{
    ...
    char description[255];   /* opis (nie musi wystąpić, bez \0) */
}

Pisałem jak powinna wyglądać ta struktura.



Kod: Zaznacz cały
struct gg_send_msg80
{
   ...
   char html_message[0];
   char plain_message[0];
   char attributes[0];
};

struct gg_recv_msg80
{
   ...
   char html_message[0];
   char plain_message[0];
   char attributes[0];
};

To (raczej) nie przejdzie...
Ostatnio edytowano wtorek, 22 grudnia 2009, 10:32 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » wtorek, 22 grudnia 2009, 10:32

Widocznie jakiś błąd przy kopiowaniu (za szybko skopiowałem) bo w kodzie mam zamienione gghdr na pakiet.type
Kod: Zaznacz cały
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
...

if(pakiet.type == GG_LOGIN80_OK)
...
if(pakiet.type == GG_LOGIN_FAILED)

Strukturę też poprawiłem. Wpisałem 0. Tak jak w Twoim poscie. Myslalem ze musi byc 255 ponieważ jest to maksymalna długość opisu jak wyczytałem z protokołu.

Lecz to nic nie daje nadal nie jestem zalogowany

Co do struktury logowania:
Kod: Zaznacz cały
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[1989];   /* treść w formacie HTML (zakończona \0) */
   char plain_message[1989];   /* treść czystym tekstem (zakończona \0) */
   char attributes[0x01];   /* atrybuty wiadomości */
};

1989 - tyle używa oryginalny klient gg
atrybuty wiadomosci to podkreslenie itp? jesli tak to 0x01 bedzie odpowiednie. Dobrze uzupelniona?
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 » wtorek, 22 grudnia 2009, 11:26

No to nie wiem. Pakiet, przy założeniu, że zastosowałeś wszystkie moje sugestie, jest złożony poprawnie. Nie wnikam w poprawność poszczególnych wartości, od tego jest opis protokołu. Nie sprawdzasz co zwracają ReceiveBuf i SendBuf, a samo stwierdzenie, że nie jesteś zalogowany niewiele mi mówi...




Co do struktury logowania:

Z logowaniem to ona nie ma nic wspólnego 8-)

Dobrze uzupelniona?

I tak, i nie. Ja dałbym tak:
Kod: Zaznacz cały
struct gg_send_msg80
{
   int recipient; 
   int seq;     
   int clas;     
   int offset_plain;   
   int offset_attributes; 
};

pola html_message, plain_message i attributes dokleiłbym za gg_send_msg80, podobnie jak description przy logowaniu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2187
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 204
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    NieznanyNieznana

Re: BCB6 - Klient Gadu Gadu

Nowy postprzez mko000 » wtorek, 29 grudnia 2009, 09:21

Jednak nie sprostam zadaniu. Nadal nie rozumiem tego logowania a więc wrócę do tematu gdy będe już więcej umiał. Dziekuję za pomoc
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 arni077 » wtorek, 29 grudnia 2009, 22:14

Witam
Przyglądałem się tej dyskusji i bardzo mi ona pomogła połączyć i zalogować się do gg w moim programie. Postanowiłem pomóc i dać tu mój program, bo w końcu dzięki wam go napisałem, a widzę że jeszcze się tu nie udało nikomu zalogować.
Jest w nim troszkę pomotane ale jestem początkującym programistą więc nie ma co oczekiwać jakiegoś wypasionego programu. ;p
http://arni077.prv.pl/GG-spamer.rar

Za ten post autor arni077 otrzymał podziękowanie od:
mko000
Avatar użytkownika
arni077
Bladawiec
Bladawiec
 
Posty: 1
Dołączył(a): wtorek, 22 grudnia 2009, 03:48
Podziękował : 0
Otrzymał podziękowań: 1
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2009
    NieznanyNieznana

Poprzednia stronaNastę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