Bonjour,
En commençant à travailler un peu sur les sockets, je m'rends compte que c'est vraiment pas pratique de travailler directement sur les octets reçus par le socket.
Pour pallier à ça j'aimerais utiliser la classe BinaryReader (qui elle même demande une classe stream).
J'ai fait ce petit bout de code pour m'entraîner mais rien n'y fait... y'a un détail que je dois pas saisir dans les streams...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net.Sockets;
using System.Threading;
namespace MouchBotConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bienvenue dans les essais de sockets !");
Console.WriteLine("--------------------------------------");
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("213.248.126.180", 5555);
if (socket.Connected)
{
Console.WriteLine("Connexion au serveur Dofus réussie...");
Console.WriteLine("");
NetworkStream stream = new NetworkStream(socket);
BinaryReader reader = new BinaryReader(stream);
byte[] response = new byte[1024];
int bytesRec;
while (true)
{
bytesRec = socket.Receive(response);
Console.WriteLine("{0} octets reçus.", bytesRec);
//Console.WriteLine(reader.ReadInt16());
for (int i = 0 ; i<bytesRec ; i++)
{
Console.Write(response.ToString("X2") + " ");
}
Console.WriteLine("");
Console.WriteLine("");
}
}
else Console.WriteLine("La connexion au serveur a échoué.");
}
}
}
Quelle est la bonne méthode pour utiliser un Networkstream ?
Ou alors
Est-ce que la meilleur solution ne serait pas finalement d'utiliser MemoryStream de response à chaque tour de mon while ?
Faut-il à ce moment là faire un new MemoryStream à chaque fois, ne peut-on pas utiliser le précédent en le resettant ? Je n'ai pas vu de telles fonctions dans MSDN...
D'une manière générale, créer autant d'objets MemoryStream et BinaryReader que j'aurai de réponses risque de générer des problèmes de mémoire non ?? ou est-ce que le C# est assez malin pour détruire les anciens ?
J'ai essayé la seconde méthode mais elle me renvoie un résultat inattendu...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net.Sockets;
using System.Threading;
namespace MouchBotConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Bienvenue dans les essais de sockets !");
Console.WriteLine("--------------------------------------");
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("213.248.126.180", 5555);
if (socket.Connected)
{
Console.WriteLine("Connexion au serveur Dofus réussie...");
Console.WriteLine("");
byte[] response = new byte[1024];
int bytesRec;
while (true)
{
bytesRec = socket.Receive(response);
Console.WriteLine("{0} octets reçus.", bytesRec);
MemoryStream stream = new MemoryStream(response);
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine(reader.ReadInt16());
for (int i = 0 ; i<(int)bytesRec ; i++)
{
Console.Write(response.ToString("X2") + " ");
}
Console.WriteLine("");
Console.WriteLine("");
}
}
else Console.WriteLine("La connexion au serveur a échoué.");
}
}
}
Voilà le résultat en console :
Loading Image
Ce résultat vous parait normal ? Qu'est ce qui foire alors ?
N'hésitez pas non plus à me faire qq retours sur ma manière d'implémenter, je découvre tout juste le framework .NET :)
Merci et bonne journée !