tu masz napisany przeze mnie prosty serwerek gg obsługujący logowanie się i pokazywanie kontaktu z numerem 666 jako dostępny (i na razie to wszystko gdyż niewiem jak uaktywnić wątki w konsolowym c++)
kod serwera:
#include <conio.h>
#include <iostream>
#include <winsock.h>
using namespace std;
#define GG_LOGIN60 0x0015
#define GG_WELCOME 0x0001
#define GG_LOGIN_OK 0x0003
#define GG_NOTIFY_LAST 0x0010
#define GG_NOTIFY_REPLY 0x000c
struct gg_header {
int type; /* typ pakietu */
int length; /* długość reszty pakietu */
};
struct gg_welcome {
int seed; /* klucz szyfrowania hasła */
};
struct gg_login60 {
int uinzz; /* mój numerek */
int hash; /* hash hasła */
int status; /* status na dzień dobry */
int version; /* moja wersja klienta */
char unknown1; /* 0x00 */
int local_ip; /* mój adres ip */
short local_port; /* port, na którym słucham */
int external_ip; /* zewnętrzny adres ip */
short external_port; /* zewnętrzny port */
char image_size; /* maksymalny rozmiar grafiki w KB */
char unknown2; /* 0xbe */
char description[71]; /* opis, nie musi wystąpić */
int time; /* czas, nie musi wystąpić */
};
struct gg_login_ok {
};
struct gg_notify {
int uin; /* numerek danej osoby */
char type; /* rodzaj użytkownika */
};
struct gg_notify_reply {
int uin; /* numer */
char status; /* status danej osoby */
int remote_ip; /* adres ip delikwenta */
short remote_port; /* port, na którym słucha klient */
int version; /* wersja klienta */
short unknown1; /* znowu port? */
char description[]; /* opis, nie musi wystąpić */
int time; /* czas, nie musi wystąpić */
};
struct gg_login_ok login_ok;
struct gg_header header;
struct gg_welcome welcome;
struct gg_login60 login;
struct gg_notify notify;
struct gg_notify_reply notify_rep;
/******************************************************************************/
/******************************************************************************/
void clear(struct gg_header *header)
{
header->type=0;
header->length=0;
}
/******************************************************************************/
void stan(gg_login60 *login);
/******************************************************************************/
char status[99];
int main(void)
{
cout << "****************************************\n"
<< "Emulator serwera Gadu-Gadu by .:Marduk:.\n"
<< "****************************************\n\n";
WSADATA wsaData;
SOCKET sock_serwer,sock_klient;
struct sockaddr_in sock_in;
int rozmiar = sizeof(sock_in);
WSAStartup(MAKEWORD(2,0), &wsaData );
sock_serwer=socket(AF_INET, SOCK_STREAM, 0);
sock_in.sin_family = AF_INET;
sock_in.sin_addr.s_addr = INADDR_ANY;
sock_in.sin_port = htons(8074);
memset(sock_in.sin_zero, 0, 8);
bind(sock_serwer,(sockaddr *)&sock_in, sizeof(sock_in));
listen(sock_serwer,2);
cout << "|- Waiting for connection -|\n";
sock_klient = accept(sock_serwer,(sockaddr *)&sock_in, &rozmiar);
if(sock_klient!=INVALID_SOCKET)
{
system("cls");
cout << "|- Connection Accepted -|\n\n";
}
clear(&header);
header.type=GG_WELCOME;
header.length=sizeof(welcome);
welcome.seed=12345;
send(sock_klient,(char*)&header,sizeof(header),0);
send(sock_klient,(char*)&welcome,sizeof(welcome),0);
cout << "Wyslano pakiet gg_welcome wraz z gg_header\n";
recv(sock_klient,(char*)&header,sizeof(header),0);
recv(sock_klient,(char*)&login,sizeof(login),0);
////////////////////////////////////////////////////////////////////////////////
stan(&login);
cout << "Odebrano pakiet gg_login wraz z gg_header\n\n"
<< "Dane zalogowane osoby:\n" << "Numer > " << login.uinzz << endl
<< "Status > " << status << endl
<< "Opis > " << login.description << endl;
clear(&header);
header.type=GG_LOGIN_OK;
header.length=0;
send(sock_klient,(char*)&header,sizeof(header),0);
send(sock_klient,(char*)&login_ok,0,0);
clear(&header);
recv(sock_klient,(char*)&header,sizeof(header),0);
recv(sock_klient,(char*)¬ify,sizeof(notify),0);
clear(&header);
header.type=GG_NOTIFY_REPLY;
header.length=sizeof(notify_rep);
notify_rep.uin=666;
notify_rep.status=4; //0x0002
notify_rep.remote_ip=NULL;
notify_rep.remote_port=NULL;
notify_rep.version=0x24;
notify_rep.unknown1=NULL;
strcpy(notify_rep.description,"");
notify_rep.time=NULL;
send(sock_klient,(char*)&header,sizeof(header),0);
send(sock_klient,(char*)¬ify_rep,sizeof(notify_rep),0);
clear(&header);
cout << "Nacisniecie dowolnego klawisza spowoduje zamkniecie programu...\n";
getch();
closesocket( sock_serwer );
closesocket( sock_klient );
WSACleanup();
return 0;
}
/******************************************************************************/
void stan(gg_login60 *login)
{
char stat[99];
switch(login->status)
{
case 1 :
strcpy(stat,"Niedostepny");
break;
case 2 :
strcpy(stat,"Dostepny");
break;
case 3 :
strcpy(stat,"Zajety");
break;
case 4 :
strcpy(stat,"Dostepny (z opisem)");
break;
case 5 :
strcpy(stat,"Zajety (z opisem)");
break;
case 6 :
strcpy(stat,"Zablokowany");
break;
case 20 :
strcpy(stat,"Niewidoczny");
break;
case 21 :
strcpy(stat,"Niedostepny (z opisem)");
break;
case 22 :
strcpy(stat,"Niewidoczny (z opisem)");
break;
case 32768 :
strcpy(stat,"Maska bitowa oznaczajaca tryb tylko dla przyjaciol");
break;
default :
strcpy(stat,"ERROR Nie mozna odczytac!");
break;
}
strcpy(status,stat);
return;
}
/******************************************************************************/
/* 0x0001 << Niedostepny << 1
0x0015 << Niedostepny (z opisem) << 21
0x0002 << Dostepny << 2
0x0004 << Dostepny (z opisem) << 4
0x0003 << Zajety << 3
0x0005 << Zajety (z opisem) << 5
0x0014 << Niewidoczny << 20
0x0016 << Niewidoczny (z opisem) << 22
0x0006 << Zablokowany << 6
0x8000 << Maska bitowa oznaczajaca tryb tylko dla przyjaciol << 32768
*/
</conio></iostream></winsock>
PS: Łaczy sie na porcie 8074.