Mam problem z programem ktory ma logować sie na GG, zmieniac status na dostepny i wysylac wiadomosc.
Zaraz po wyslaniu wiadomosci znowu status robi sie niedostepny
Caly kod wyglada tak://---------------------------------------------------------------------------
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <winsock2.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
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;
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject Sender)
{
WSAData wsa;
WSAStartup(0x101,&wsa);
SOCKET gniazdo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (gniazdo==INVALID_SOCKET)
{
Memo1->Lines->Add("Error");
}
else
{
Memo1->Lines->Add("Gniazdo utworzone");
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("217.17.45.144");;
clientService.sin_port = htons(8074);
int r = connect(gniazdo,(SOCKADDR)&clientService,sizeof(clientService));
if (r==SOCKET_ERROR)
{
Memo1->Lines->Add("Blad podczas laczenia ");
}
else
{
Memo1->Lines->Add("Polaczony ");
gg_welcome w;
recv(gniazdo,(char*)&w,12,0);
cout << w.seed << endl;
gg_login60 g;
g.type=0x15;
g.length=sizeof(gg_login60)-8;
g.uin=numer;
g.hash=gg_login_hash((unsigned char*)"XXX",w.seed);
g.status=2;
g.version=0x29;
g.unknown1=0x00;
g.local_ip=0;
g.local_port=0;
g.external_ip=0;
g.external_port=0;
g.image_size=256;
g.unknown2=0xbe;
send(gniazdo,(char*)&g,sizeof(g),0);
int login;
recv(gniazdo,(char*)&login,4,0);
if (login==0x0003)
{
Memo1->Lines->Add("Zalogowany ");
}
else
Memo1->Lines->Add("Logowanie nie wyszlo ");
gg_new_status stat;
stat.status=4;
stat.type=2;
char * opis = "opis";
for (int i=0;i<strlen(opis);i++) stat.description[i]=opis[i];
stat.size=strlen(opis)+4;
send(gniazdo,(char*)&stat,12+strlen(opis),0);
Memo1->Lines->Add("Zmiana statusu");
gg_send_msg wiad;
wiad.recipient=numer;
wiad.seq=1;
wiad.class1=0x0004;
for (int i=0;i<strlen(opis);i++) {wiad.message[i]=opis[i]; wiad.message[i+1]=0x00;}
wiad.typ=GG_SEND_MSG;
wiad.size=strlen(wiad.message)+4+4+4;
send(gniazdo,(char*)&wiad,sizeof(wiad),0);
Memo1->Lines->Add("Wysylanie wiadomosci");
}
}
}
//---------------------------------------------------------------------------
Kiedy usunę wysylanie wiadomości program dziala zupelnie poprawnie, status jest dostepny az do zamkniecia programu.
Podejrzewam ze moj blad polega na tym, ze wysylam najpierw pakiet do zmiany statusu ([b]send(gniazdo,(char*)&stat,12+strlen(opis),0);[/b]), a potem wysylania wiadomosci ([b]send(gniazdo,(char*)&wiad,sizeof(wiad),0);[/b]).
PS. Jak moge ten kod przerobic tak zeby wykorzystywal komponent ClientSocket?