Wysyłanie wiadomośći GG

0

Ostatnio siedzę nad protokołem gg, zatrzymałem się przy wysyłaniu i odbieraniu wiadomości, wysyłam jakąś wiadomość i odbieram w orginalnym kliencie no ale zamiast tego co wysłałem dochodzi coś dziwnego np XA ĆĄ...

#define GG_SEND_MSG80 0x002d

    struct gg_send_msg80 {
        int recipient;      /* numer odbiorcy */
        int seq;        /* numer sekwencyjny */
        int classs;     /* klasa wiadomoťci */
        int offset_plain;   /* po│o┐enie treťci czystym tekstem */
        int offset_attributes;  /* po│o┐enie atrybutˇw */
        char html_message[200]; /* treťŠ w formacie HTML (zako˝czona \0) */
        char plain_message[200];    /* treťŠ czystym tekstem (zako˝czona \0) */
        char attributes;    /* atrybuty wiadomoťci */
    }mmss;

    mmss.recipient = 2357907;       /* numer odbiorcy */
    mmss.seq=rand() % 65000;        /* numer sekwencyjny */
    //mmss.classs=0x0008;       /* klasa wiadomoťci */
    mmss.classs=0x0020;     /* klasa wiadomoťci */
    mmss.offset_plain=0;    /* po│o┐enie treťci czystym tekstem */
    mmss.offset_attributes=0;   /* po│o┐enie atrybutˇw */
    strcpy(mmss.html_message, "\0");
    strcpy(mmss.plain_message, "elo\0");
    mmss.attributes = 0x00; /* atrybuty wiadomoťci */

    header.type=GG_SEND_MSG80;
    header.length=sizeof(mmss);
    send(sockd, (char*)&header, sizeof(header),0); 

    if(send(sockd, (char*)&mmss, header.length,0 ))
    {
        clear(&header);
        printf("Wyslano\n");
    }

Wydaje mi się że coś jest ze strukturą, źle ją wypełniam albo co... Tylko nie wiem co...

0

A spróbuj te pola ze stringami (html_message, plain_message) wypełnić normalnie, bez \0. Wydaje mi się, że w komentarzu chodziło o to, że tam po prostu ma być ciąg bajtów oznaczający tekst i jeden bajt 0 (znak '\0') na końcu. Ten znak '\0' jest jednak już zawarty w każdym c-stringu. Gdy masz c-string "abc", to są to bajty (chary):

'a'
'b'
'c'
'\0'

A jak Ty wrzucasz tam jeszcze \0, to robi się z tego:

'a'
'b'
'c'
'\0'
'\0'

Bo po prostu w momencie gdy piszesz w C tekst w cudzysłowach, to znak '\0' jest tam automatycznie doklejany. Skasuj więc to \0 ze swoich stringów i powinno być OK (chyba że błąd masz gdzieś indziej, nie wgłębiałem się, a te \0 rzuciły mi się w oczy).

0

Tu raczej chodzi o offsety. Bo to, czy będzie jedno zero więcej czy nie, nie ma aż takiego znaczenia. I tak na sztywno wysyła dwie tablice po 200 bajtów. Wracając do offsetów, ustaw je względem początku struktury gg_send_msg80.

No i atrybuty chyba powinny być ustawione:

char attributes = { 2, 6, 0, 0, 0, 8, 0, 0, 0};
0
0x666 napisał(a)

Tu raczej chodzi o offsety. Bo to, czy będzie jedno zero więcej czy nie, nie ma aż takiego znaczenia. I tak na sztywno wysyła dwie tablice po 200 bajtów. Wracając do offsetów, ustaw je względem początku struktury gg_send_msg80.

No i atrybuty chyba powinny być ustawione:

char attributes = { 2, 6, 0, 0, 0, 8, 0, 0, 0};

Mógł byś to bardziej rozwinąć, ustawiałem offsety ale to samo.. Nie wiem może źle, liczyłem bity do tablicy z tekstem do wysłania i wpisywałem tą wartość. A z tym sztywnym wysyłaniem? Chodzi Ci o to że jest stały rozmiar tablicy w strukturze ?

0

Według tego, co teraz masz, offsety powinny być ustawione tak:

mmss.offset_plain = 220;
mmss.offset_attributes = 420;

Chodzi Ci o to że jest stały rozmiar tablicy w strukturze ?

Tak.

0
0x666 napisał(a)

Według tego, co teraz masz, offsety powinny być ustawione tak:

mmss.offset_plain = 220;
mmss.offset_attributes = 420;

Dalej jest to samo tylko zamiast XAXA dochodzi ^ więc w tym jest problem..
Co do atrybutów to nie wiem czy dobrze zrobiłem

char attributes[9]; /* atrybuty wiadomości */

mmss.attributes[0] = '2';
    mmss.attributes[1] = '6';
    mmss.attributes[2] = '0';
    mmss.attributes[3] = '0';
    mmss.attributes[4] = '0';
    mmss.attributes[5] = '8';
    mmss.attributes[6] = '0';
    mmss.attributes[7] = '0';
    mmss.attributes[8] = '0';

Ale zobacz jak dam wskaźniki na tablice, i będe dynamicznie ustawiał ich rozmiar

char* html_message;        /* treťŠ w formacie HTML (zako˝czona \0) */
   char* plain_message;        /* treťŠ czystym tekstem (zako˝czona \0) */

To będe chyba wysyłał same wskaźniki a nie to na co one wskazują...

0

A kto mówi o wskaźnikach? Wystarczy taka struktura:

struct gg_send_msg80 
{
    int recipient;                
    int seq;                
    int classs;            
    int offset_plain;    
    int offset_attributes;
};

Najpierw ją wysyłasz, a po niej html_message, plain_message i attributes.

0
0x666 napisał(a)

A kto mówi o wskaźnikach? Wystarczy taka struktura:

struct gg_send_msg80 
{
int recipient;                
int seq;                
int classs;            
int offset_plain;    
int offset_attributes;
};

Najpierw ją wysyłasz, a po niej html_message, plain_message i attributes.

No w sumie masz racje, tylko najpierw musiał bym to ustawić żeby w ogóle dobrze wysyłało

0

W opisie protkołu znalazłem coś takiego..

Długość treści wiadomości nie powinna przekraczać 2000 znaków. Oryginalny klient zezwala na wysłanie do 1989 znaków. Treść w formacie HTML jest kodowana UTF-8. Treść zapisana czystym tekstem jest kodowana zestawem znaków CP1250. W obu przypadkach, mimo domyślnych atrybutów tekstu, oryginalny klient dodaje informacje o formatowaniu tekstu. Dla HTML wygląda to następująco:

Treść

Dla czystego tekstu dodawane są informacje o tym, że tekst ma kolor czarny:

0

Coś w ten deseń:

string plain_text;  //<--- w CP1250
string html_text;   //<--- w utf8
static const char attributes[] = { 2, 6, 0, 0, 0, 8, 0, 0, 0};

(...)

mmss.offset_plain = sizeof(gg_send_msg80) + html_text.size() + 1;   
mmss.offset_attributes = mmss.offset_plain + plain_text.size() + 1;

(...)

header.type = GG_SEND_MSG80;
header.length = mmss.offset_attributes + sizeof(attributes);

send(sockd,&header, sizeof(header),0); 
send(sockd,&mmss,sizeof(gg_send_msg80),0);
send(sockd,html_text.c_str(),html_text.size() + 1,0);
send(sockd,plain_text.c_str(),plain_text.size() + 1,0);
send(sockd,attributes,sizeof(attributes),0);

Ten kod jest poglądowy, te wszystkie sendy powinny być sprawdzone...

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0