using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using RaidBot.Common.IO;
namespace RaidBot
{
public partial class Form1 : Form
{
#region COnstructeurs
public Form1()
{
InitializeComponent();
}
#endregion
#region Attributs
private Socket _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private Thread _ReceptionThread;
#endregion
#region Methodes privées
private void Log(string Text)
{
Action log_callback = (Action)delegate
{
TXT_Log.Text += Text + "\r\n"; // Ajout du texte avec un saut à la ligne en fin.
TXT_Log.Select(TXT_Log.Text.Length, 0); // On place le curseur à la fin de la zone de texte.
TXT_Log.ScrollToCaret(); // On descend la barre de défilement jusqu'au curseur.
};
this.Invoke(log_callback);
}
private void BT_Connexion_Click(object sender, EventArgs e)
{
try
{
_Socket.Connect("213.248.126.39", 5555); // Connexion au serveur d'authentification.
// On test l'état de la connexion.
if (_Socket.Connected)
{
Log("La connexion au serveur d'authentification est réussie.");
_ReceptionThread = new Thread(new ThreadStart(Reception));
_ReceptionThread.Start();
}
else
{
Log("La connexion au serveur d'authentification a échouée.");
}
}
catch (SocketException sock_ex)
{
Log("[SocketException] " + sock_ex.Message);
}
}
private void Reception()
{
// On reçoit les données tant qu'on est connecté.
while (_Socket.Connected)
{
// On crée notre buffer dynamique.
byte[] _buffer = new byte[_Socket.Available];
// Si le buffer n'est pas vide, on le parse.
if (_buffer.Length != 0)
{
_Socket.Receive(_buffer); // Récéption des données.
ParseData(_buffer); // Parsing des données.
}
}
}
private void ParseData(byte[] DataToParse)
{
// Déclaration des variables qui seront utilisées
int index = 0;
short id_and_packet_lenght_type, packet_id, packet_lenght_type;
Int32 packet_lenght = 0;
byte[] packet_content;
// Lecture jusqu'à la fin de byte[] data
while (index != DataToParse.Length)
{
// Décodage du header
id_and_packet_lenght_type = (short)(DataToParse[index] * 256 + DataToParse[index + 1]); // Selection des 2 premiers octets du paquet
packet_id = (short)(id_and_packet_lenght_type >> 2); // Récupérer l'ID du paquet
packet_lenght_type = (short)(id_and_packet_lenght_type & 3); // Récupérer la taille de la taille de la longueur du paquet
index += 2; // On se déplace 2 octets plus loin
// Récupération de la taille du paquet
switch (packet_lenght_type)
{
case 0:
packet_lenght = 0;
break;
case 1:
packet_lenght = DataToParse[index];
break;
case 2:
packet_lenght = DataToParse[index] * 256 + DataToParse[index + 1];
break;
case 3:
packet_lenght = DataToParse[index] * 65536 + DataToParse[index + 1] * 256 + DataToParse[index + 2];
break;
}
// Récupération du contenu du paquet
packet_content = new byte[(int)packet_lenght];
Array.Copy(DataToParse, index + packet_lenght_type, packet_content, 0, packet_lenght);
// Création de la variable contenant le contenu du paquet en héxadécimal
string content_hex = string.Empty;
int huit_bytes = 0;
foreach (byte b in packet_content)
{
if (huit_bytes == 8)
{
content_hex += "\r\n";
huit_bytes = 0;
}
content_hex += b.ToString("X2") + " ";
huit_bytes++;
}
// Jounalisation
Log("[Reçu] ID = " + packet_id + " | Taille du contenu = " + packet_lenght + "\r\n" + content_hex);
// Traitement du paquet
TreatPacket(packet_id, packet_content);
// Définition de l'index qui démarre le paquet suivant
index += packet_lenght + packet_lenght_type;
}
}
private void TreatPacket(int PacketID, byte[] PacketContent)
{
CustomDataReader reader = new CustomDataReader(PacketContent);
switch (PacketID)
{
case 1:
// Ici nous savons que nous sommes bien connecté au serveur.
break;
}
}
#endregion
}
}