Socket i połączenie z 8074

0

Napisałem taki malutki programik do połączenia z serwerem gadu gadu na porcie 8074 wygląda on tak:

	SOCKET sock;

	WSAStartup( MAKEWORD( 2, 0), &Wsa);
	sock = socket( 2, SOCK_STREAM, IPPROTO_TCP);

	int opt = 4096; //4 KB
	bool bopt = true;
	setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&opt, sizeof(opt));
	setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&opt, sizeof(opt));
	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt));
	setsockopt(sock, SOL_SOCKET, SO_DONTLINGER, (char*)&bopt, sizeof(bopt));

	sockaddr_in Addr;
	Addr.sin_family = 2;
	Addr.sin_port = htons(1044);
	Addr.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
	memset(Addr.sin_zero, 0, 8);

	bind(sock, (sockaddr*)&Addr, sizeof(sockaddr));

	Addr.sin_port = htons(8074);
	Addr.sin_addr.S_un.S_addr = inet_addr ("62.225.40.2");
	connect(sock, (sockaddr*)&Addr, sizeof(sockaddr));
	send( sock, "coś tam coś tam coś", 19, 0 );
	getch();

	closesocket(sock);
	WSACleanup();

Jednak gdy w konsoli wpisze netstat -a pokazuje mi że otwarty jest u mnie port 1044 a adresu z którym się połączyłem nie ma. Gdy włączam normalnie gg to jest napisane gadugadu.pl:8074. Czy mój program jest poprawny? A może coś nie działa?

0

sprawdzaj wartosci zwracane przez funkcje winsock. proponuje tez przejrzec kod na www.winapi.org

0

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*)&notify,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*)&notify_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.
0

Wielkie dzięki o coś takiego mi chodziło.

Mam tylko pytanie:

send(sock_klient,(char*)&header,sizeof(header),0);
send(sock_klient,(char*)&welcome,sizeof(welcome),0);

Dlaczego najpierw wysyłasz to na serwer? Zgodnie z protokołem gg najpierw się otrzymywało jakieś pakiety...

poza tym programik coś nie chodzi. Ciągle czeka na połączenie. Nie zauważyłem gdzie wybierasz z czym się łączysz. A i jak dawno to pisałeś bo może zaszły jakieś zmiany w protokole?

0

Emmm to nie jest klient gadu-gadu ale serwer, do niego mozna sie podlaczyc nie inaczej

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