Re: [C] Comment faire son reader/writer ?
Tifoux, merci mais ça ne m'aide pas vraiment je pense que mon problème vient d'ailleurs :/
Toons, merci tu avais raisons à ce propos, c'est pour ça que lorsque je mettais
Index += Taille + TailleDeTaille
à la fin de ma boucle ça faisait freeze mon programme, j'ai corrigé cela et j'en ai profité pour ré-organiser :
Connexion.c
Cliquez pour révéler
Cliquez pour masquer
#include "connexion.h"
void Connexion ()
{
WSADATA WSAData;
WSAStartup (MAKEWORD (2, 2), &WSAData);
//Socket Client -> Serveur
SOCKET Sock;
Sock = socket (AF_INET, SOCK_STREAM, 0);
if (Sock == INVALID_SOCKET)
{
printf ("Erreur : Socket invalide \n");
exit (0);
}
//On configure la connexion Client vers Serveur
SOCKADDR_IN Sin;
Sin.sin_addr.s_addr = inet_addr ("213.248.126.39");
Sin.sin_family = AF_INET;
Sin.sin_port = htons (5555);
printf("[+] Connexion a %s sur le port %d\n", inet_ntoa(Sin.sin_addr), htons(Sin.sin_port));
if (connect (Sock, (SOCKADDR *)&Sin, sizeof(Sin)) == (signed)INVALID_SOCKET)
{
printf ("[-] Erreur : Connexion \n");
exit (0);
}
printf("[+] Connexion au serveur dofus reussi. \n\n");
char *Buffer = NULL;
while (Sock != (unsigned)SOCKET_ERROR)
{
Buffer = calloc (8192, sizeof (char));
if (Buffer == NULL) { exit (0); }
//On réceptionne les données
recv (Sock, Buffer, 8192, 0);
if (Buffer != NULL)
{
//On Parse le buffer
Parse (Buffer);
}
free (Buffer);
Buffer = NULL;
}
closesocket (Sock);
WSACleanup ();
}
Parse.c
Cliquez pour révéler
Cliquez pour masquer
#include "parse.h"
//Parse le buffer
void Parse (char *Data)
{
//Déclaration des variables utilisés
int Index = 0;
short Header, ID, TailleDeTaille;
int Taille;
int i;
int Position = 0;
char *Donnees = NULL;
//On parcours tout le buffer
while (Index < sizeof(Data))
{
//On prend les 2 premiers octets
Header = GetHeader (Index, Data);
//On récupère l'ID
ID = GetID (Header);
//On récupère la taille de la taille du Header
TailleDeTaille = GetLenghtSize (Header);
//On déplace le curseur de 2 octets plus loin
Index += 2;
//On récupère la taille du paquet
Taille = GetSize (TailleDeTaille, Taille, Index, Data);
//Allocation de mémoire de taille de la variable Taille
Donnees = calloc (1, Taille);
if (Donnees == NULL) { exit (0); }
//On copie le contenu du 1er paquet dans Donnees
for(i = 0; i < Taille; i++)
{
Donnees = Data [Position + i];
}
//On se positionne pour le prochain paquet
Position += Taille;
//On affiche les ID & leur taille si > 0
if (ID != 0 && Taille != 0)
{
printf ("[ID] : %d [Taille] : %d \n", ID, Taille);
}
//On traîte les paquets
TraitementPaquet (ID, Donnees);
//On se positionne pour le paquet suivant
Index += Taille + TailleDeTaille;
//On libère la mémoire et on la remet à NULL
free (Donnees);
Donnees = NULL;
}
}
//On prend les 2 premiers octets
short GetHeader (int Index, char *Data)
{
return (Data [Index] << 8) + (Data [Index + 1]);
}
//On prend l'ID du paquet
short GetID (short Data)
{
return Data >> 2;
}
//On récupère la taille de la taille du Header
short GetLenghtSize (short Data)
{
return Data & 3;
}
//On récupère la taille
short GetSize (short TailleDeTaille, short Taille, short Index, char *Data)
{
switch(TailleDeTaille)
{
case 0:
Taille = 0;
break;
case 1:
Taille = Data [Index];
break;
case 2:
Taille = (Data [Index] << 8) + Data [Index + 1];
break;
case 3:
Taille = (Data [Index] << 16) + (Data [Index + 1] << 8) + Data [Index + 2];
break;
}
return Taille;
}
Traitement.c
Cliquez pour révéler
Cliquez pour masquer
#include "traitement.h"
void TraitementPaquet (int ID, char *Donnees)
{
int RequiredVersion, CurrentVersion; //ID 1
switch (ID)
{
//Traitement de l'ID 1
case 1:
pos = 0;
RequiredVersion = ReadInt (Donnees);
CurrentVersion = ReadInt (Donnees);
printf ("RequiredVersion : %d \nCurrentVersion : %d \n\n", RequiredVersion, CurrentVersion);
break;
//Traitement de l'ID 3
case 3:
break;
//Traitement de l'ID 4
case 4:
break;
}
}
//Reader Short
short ReadShort(char *Data)
{
short s = (Data [pos] << 8) + Data [pos + 1];
pos += 2;
return s;
}
//Reader Int
int ReadInt (char *Data)
{
int s = (Data [pos] << 24) + (Data [pos + 1] << 16) + (Data [pos + 2] << 8) + Data [pos + 3];
pos += 4;
return s;
}
//Reader Byte
char ReadByte (char *Data)
{
char s = Data [pos];
pos += 1;
return s;
}
Traitement.h
Cliquez pour révéler
Cliquez pour masquer
#ifndef TRAITEMENT_H_INCLUDED
#define TRAITEMENT_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "parse.h"
int pos;
void TraitementPaquet (int ID, char *Donnees);
//Fonctions pour décryptage des paquets
short ReadShort (char *Data);
int ReadInt (char *Data);
char ReadByte (char *Data);
#endif // TRAITEMENT_H_INCLUDED
Merci de votre aide en tout cas, j'espère résoudre ce problème qui m'empêche d'avancer :(