C# {mitm}je recoit que le packet 1 oO

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#1
Salut, alors que je recommencer la partie mitm de mon bot en asynchrome je bloque sur un problélme, mes 2 client son connecter (un au client d2 et un au server d2) mais je recoit que le packet 1 et apres plus rien (sauf des fois un latancystatsmessage ou un truque comme ca) je voie vraiment pas d'ou ca vien voila ma class client

Code:
    public class Client
    {
        private Socket ClientSocket;
        private byte[] buffer;
        private int bufferLength;

        public event EventHandler<DataReceivedEventArgs> DataReceived;
        private void OnDataReceived(DataReceivedEventArgs e)
        {
            if (DataReceived != null)
                DataReceived(this, e);
        }

        public Client(Socket socket)
        {
            ClientSocket = socket;
            bufferLength = 256;
            buffer = new byte[bufferLength];
            ClientSocket.BeginReceive(buffer, 0, bufferLength, SocketFlags.None, new AsyncCallback(ReceiveCallBack), ClientSocket);
        }

        public Client(IPEndPoint ipendpoint)
        {
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ClientSocket.BeginConnect(ipendpoint, new AsyncCallback(ConnectCallBack), ClientSocket);
        }

        private void ConnectCallBack(IAsyncResult asyncResult)
        {
            ClientSocket = (Socket)asyncResult.AsyncState;
            ClientSocket.EndConnect(asyncResult);
            bufferLength = 256;
            buffer = new byte[bufferLength];
            ClientSocket.BeginReceive(buffer, 0, bufferLength, SocketFlags.None, new AsyncCallback(ReceiveCallBack), ClientSocket);
            Console.WriteLine("Client connecter");
        }

        private void ReceiveCallBack(IAsyncResult asyncResult)
        {
            int byteToRead = ClientSocket.EndReceive(asyncResult);
            OnDataReceived(new DataReceivedEventArgs(buffer));
        }

        public void Send(byte[] data)
        {
            ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallBack), ClientSocket);
        }

        private void SendCallBack(IAsyncResult asyncResult)
        {
            SocketError errorCode;
            int byteSended = ClientSocket.EndSend(asyncResult,out errorCode);
            if (errorCode != SocketError.Success)
            {
                 
            }
        }
    }

    public class DataReceivedEventArgs : EventArgs
    {
        public byte[] Data { get; private set; }

        public DataReceivedEventArgs(byte[] data)
        {
            Data = data;
        }
    }
et me module qui fait fonctionner ca

Code:
using OverBand.Common.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Server
{
    static class Program
    {
        private static Server server;
        private static Client SourceClient, DestinationClient;

        [STAThread]
        static void Main()
        {
            server = new Server();
            server.Listen(5555);
            server.ConnectionAccepted += server_ConnectionAccepted;
            Console.ReadLine();
        }

        static void server_ConnectionAccepted(object sender, ConnectionAcceptedEventArgs e)
        {
            Console.WriteLine("Client accepter");
            SourceClient = new Client(e.Client);
            SourceClient.DataReceived += newClient_DataReceived;
            DestinationClient = new Client(new System.Net.IPEndPoint(IPAddress.Parse("213.248.126.39"), 5555));
            DestinationClient.DataReceived += DestinationClient_DataReceived;

        }

        static void DestinationClient_DataReceived(object sender, DataReceivedEventArgs e)
        {
            ParseData(e.Data);
            SourceClient.Send(e.Data);
        }

        static void newClient_DataReceived(object sender, DataReceivedEventArgs e)
        {
            ParseData(e.Data);
            DestinationClient.Send(e.Data);
        }

        static void ParseData(byte[] data)
        {
            FastBigEndianReader reader = new FastBigEndianReader(data);
            uint header = reader.ReadUShort();
            uint messageId = (uint)header >> 2;
            int messageLength;
            switch (header & 3)
            {
                case 1:
                    messageLength = (int)reader.ReadByte();
                    break;
                case 2:
                    messageLength = (int)reader.ReadUShort();
                    break;
                case 3:
                    messageLength = (int)(reader.ReadByte() << 16) + (reader.ReadByte() << 8) + reader.ReadByte();
                    break;
                default:
                    messageLength = (int)0;
                    break;
            }
            byte[] messageData = reader.ReadBytes(messageLength);

            Console.WriteLine("Packet : ID  = {0} , Length = {1}", messageId.ToString(), messageLength.ToString());
        }
    }
}
class server
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    public class Server
    {
        #region Declarations

        public Socket SocketServer;

        #endregion

        #region Event

        public event EventHandler<ConnectionAcceptedEventArgs> ConnectionAccepted;
        private void OnConnectionAccepted(ConnectionAcceptedEventArgs e)
        {
            if (ConnectionAccepted != null)
                ConnectionAccepted(this, e);
        }

        #endregion

        #region Metode public

        public Server()
        {
            SocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

        public void Listen(short port)
        {
            SocketServer.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
            SocketServer.Listen(2);
            SocketServer.BeginAccept(new AsyncCallback(this.connexionAcceptCallback), SocketServer);
        }

        #endregion

        #region Metode privée

        private void connexionAcceptCallback(IAsyncResult asyncResult)
        {
            OnConnectionAccepted(new ConnectionAcceptedEventArgs(SocketServer.EndAccept(asyncResult)));
        }

        #endregion
    }

    public class ConnectionAcceptedEventArgs : EventArgs
    {
        public Socket Client { get; private set; }

        public ConnectionAcceptedEventArgs(Socket client)
        {
            Client = client;
        }
    }
}
franchement je vois pas du tout d'ou ca vien oO, surment pas du parsing vue que je recoit et envoi les donnée en brutte sa doit venir de ma class client mai je trouve pas :3

j'ais lue sur d'autre post que des fois les client asynchrome bugger avec les packet en plusieur partie mais je crois pas que c'est ca ,alor si vous aver une idée je suis preneur ! merci d'avance
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Bonsoir,

bon déjà ton buffer est trop petit, 256 ca va pas du tout. Je te recommande 8192.

Ensuite, ton BeginReceive, tu ne le lance qu'une seul fois.
Donc quand tu as recus un paquet du serveur, tu dois relancer une attente de réception.

private void ReceiveCallBack(IAsyncResult asyncResult)
{
int byteToRead = ClientSocket.EndReceive(asyncResult);
OnDataReceived(new DataReceivedEventArgs(buffer));
ClientSocket.BeginReceive(buffer, 0, bufferLength, SocketFlags.None, new AsyncCallback(ReceiveCallBack), ClientSocket);
}
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#3
ahh okok merci beaucoup, j'ais du sauter un passage sur msdn ^^'
--edite--
sa fonctionne :3
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Eheh pas de problème :)

Ce qui m'étonne c'est que tu recevais de temps en temps le latency.
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#5
c'est normal que je recoie le latancy vue que j'ais encore reçu aucun message :p, sinon sa marche pas mais la reception est bonne donc je vais chercher un peut
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Qu'est ce qui ne marche pas ?
 

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#7
je recoit le 1 puis je le renvoi apres je recoit le 3 et je le renvoi et puis plus rien
 
Inscrit
3 Février 2012
Messages
13
Reactions
0
#8
Il faut que tu envoies le 4 après le 3
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#9
Cue a dit:
Il faut que tu envoies le 4 après le 3
c'est un MITM, ya un problème d'event. Faut faire une queue. (esprit mal placé s'abstenir :p )
Soit ya un problème de redirection des paquets, soit le serveur est connecté et envoi trop vite les paquets avant que le client ne soit connecté. Enfin bref la queue règlera surement le problème.
 
Haut Bas