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?