Discussion: Freeze socket client

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut Freeze socket client

    Bonjour à tous^^

    J'ai une application client-serveur qui est une sorte de terminal(serveur) qui exécute les requêtes (tels que query SQL) du client via des instructions que j'envoie par les sockets.
    Le souci est que à la fin de ma première instruction, tout s'exécute bien(l'envoi, la query, la réception) MAIS le client freeze, j'ai cerné la ligne qui cause le bug, mais je ne comprend pas comment elle fait freeze mon client :-/

    Voici les morceau de code donc:

    coté serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IPAddress ipAdd = IPAddress.Parse(ip);
                            IPEndPoint remoteEP = new IPEndPoint(ipAdd, 100);
                            soc.Connect(remoteEP);
                            byte[] byData = Encoding.ASCII.GetBytes(pam);
                            soc.Send(byData);
                            ConsoleUtils.Write(ConsoleUtils.Type.SEND, $"Envoi du packet {PacketEnums.AcceptClient} au client")
    coté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
                    if (File.Exists("Ip.ini"))
                    {
                        StreamReader sr = new StreamReader("Ip.ini");
                        string i = sr.ReadLine();
                        TcpClient clientSocket = new TcpClient(i, 100);
     
                        NetworkStream serverStream = clientSocket.GetStream();
                        byte[] outStream = Encoding.ASCII.GetBytes(packet + ip);
                        serverStream.Write(outStream, 0, outStream.Length);
     
                        byte[] inStream = new byte[2048];
                        serverStream.Read(inStream, 0, inStream.Length); //ligne qui bug
                        Properties.Settings.Default.conf = Encoding.ASCII.GetString(inStream);
                        serverStream.Flush();
     
     
                    }
    Comment corriger cette erreur svp.? Qui est toute bête je suis sûr :-/.

    Merci d'avance de votre aide.
    Cordialement
    Vazer7070

  2. #2
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    Peux-tu nous donner des codes plus complets stp ?

    Pour l'instant, une chose me surprend, c'est qu'au niveau du serveur, tu te connectes à un nouveau point alors que typiquement, le serveur ne se connecte pas, puisque c'est le client qui se connecte à lui !
    Aussi, j'ai l'impression que tu envoies bien des données, mais pas au client !

    Du coup, quand le client attend les données, il ne les a pas et freeze...

    Mais impossible de l'affirmer avec si peu de code. Il faudrait toute la portion de code côté serveur, incluant l'appel à Socket.AcceptTcpClient.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    Bien sur, je te fourni ça^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    public class SocketManager
        {
            private static readonly Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            private static readonly List<Socket> clientSockets = new List<Socket>();
            private const int BUFFER_SIZE = 2048;
     
            private static readonly byte[] buffer = new byte[BUFFER_SIZE];
     
            public static void SetupServer()
            {
     
     
                IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
                IPAddress ipAddress = ipHostEntry.AddressList[0];
                ConsoleUtils.Write(ConsoleUtils.Type.DEBUG, $"Serveur lancé sur l'IP: {ipAddress}:{Config.LoginServerPort} ");
                serverSocket.Bind(new IPEndPoint(ipAddress, Config.LoginServerPort));
                serverSocket.Listen(0);
                serverSocket.BeginAccept(AcceptCallback, null);
     
            }
     
            private static void CloseAllSockets()
            {
                foreach (Socket socket in clientSockets)
                {
                    socket.Shutdown(SocketShutdown.Both);
                    socket.Close();
                }
     
                serverSocket.Close();
            }
     
            private static void AcceptCallback(IAsyncResult AR)
            {
                Socket socket;
     
                try
                {
                    socket = serverSocket.EndAccept(AR);
                }
                catch (ObjectDisposedException)
                {
                    return;
                }
     
                clientSockets.Add(socket);
                socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket);
                serverSocket.BeginAccept(AcceptCallback, null);
            }
     
            private static void ReceiveCallback(IAsyncResult AR)
            {
                Socket current = (Socket)AR.AsyncState;
     
                int received;
                try
                {
                    received = current.EndReceive(AR);
                }
                catch (SocketException)
                {
                    ConsoleUtils.Write(ConsoleUtils.Type.ERROR,"Connexion interrompue");
                    return;
                }
     
                byte[] recBuf = new byte[received];
                Array.Copy(buffer, recBuf, received);
                string text = Encoding.ASCII.GetString(recBuf);
               ConsoleUtils.Write(ConsoleUtils.Type.RECEIV, text);
     
                if (text.Contains(PacketEnums.RequêteClient))
                {
                    string s = text.Replace(PacketEnums.RequêteClient, "");
                    UpChat up = new UpChat();
                    up.Connect_client(s);
                }
                current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
            }
        }
    Et si le client reçois les données voulues.

  4. #4
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    J'ai l'impression qu'il manque encore du code. Où est le premier code que tu nous as fourni ? Je ne vois pas où il apparait et donc où il est appelé, alors qu'il se connecte à un nouveau socket
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    Le deuxième code est la classe de connexion général du serveur, le premier morceau est le code qui est appelle pour l'envoi des données résultantes de la query sql

  6. #6
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    ok, alors d'où vient la variable "soc" dans le premier code ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    Autant pour moi ><
    soc vient de là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  8. #8
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Ben voilà, ne cherche pas plus loin ! Il faut que tu réutilises le socket qui provient de la connexion du client au serveur, pas que tu en créés une nouvelle.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    ça ne freeze plus mais ça m'affiche l'erreur suivante:

    "vous ne pouvez pas effectuer cette opération après avoir appelé la méthode Listen".

    Or je ne vois pas de quel Listen il veut parler ><
    Le code n'a pas bougé ormis que à la place de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IPAddress ipAdd = IPAddress.Parse(ip);
    IPEndPoint remoteEP = new IPEndPoint(ipAdd, 100);
                            soc.Connect(remoteEP);
                            byte[] byData = Encoding.ASCII.GetBytes(pam);
                            soc.Send(byData);
    J'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IPAddress ipAdd = IPAddress.Parse(ip);
                            IPEndPoint remoteEP = new IPEndPoint(ipAdd, 100);
                            Network.SocketManager.serverSocket.Connect(remoteEP);
                            byte[] byData = Encoding.ASCII.GetBytes(PacketEnums.AcceptClient + pam);
                            Network.SocketManager.serverSocket.Send(byData);

  10. #10
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //IPAddress ipAdd = IPAddress.Parse(ip);
    //                        IPEndPoint remoteEP = new IPEndPoint(ipAdd, 100);
    //                        Network.SocketManager.serverSocket.Connect(remoteEP);
                            byte[] byData = Encoding.ASCII.GetBytes(PacketEnums.AcceptClient + pam);
                            Network.SocketManager.serverSocket.Send(byData);
    Tu n'as pas besoin d'ouvrir le socket, puisqu'il est déjà ouvert ! Tu as reçu des données dessus, tu peux donc en envoyer directement.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    Ben justement quand je fais ça, ça me fait cette erreur:
    Nom : unknown.png
Affichages : 28
Taille : 11,5 Ko

  12. #12
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    C'est parce que tu utilises le socket du serveur. Il faut que tu utilises le socket obtenu lorsqu'une nouvelle connexion arrive et qui est récupérée via serverSocket.EndAccept.

    Sinon, poste le code complet, car pour l'instant, on ne sait toujours pas comment est appelé le code qui te pose problème
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    Si, c'est par la classe données plus haut et dans l'appli j'ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SocketManager.SetupServer();
    Tout est dans la classe SocketManager

  14. #14
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Non !

    IPAddress ipAdd = IPAddress.Parse(ip);
    IPEndPoint remoteEP = new IPEndPoint(ipAdd, 100);
    Network.SocketManager.serverSocket.Connect(remoteEP);
    byte[] byData = Encoding.ASCII.GetBytes(PacketEnums.AcceptClient + pam);
    Network.SocketManager.serverSocket.Send(byData);
    Tu utilises le socket sur lequel écoute le serveur. Tu n'utilises pas le socket qui est créé lors d'une connexion entrante.

    Donc, merci de fournir le code complet.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  15. #15
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    mais le code du serveur socket est plus haut dans la conv
    Tiens le revoilà si tu veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading.Tasks;
    using Terminal;
    using Terminal.config;
    using informations.Packets;
    using System.Threading;
     
    namespace informations.Network
    {
        public class SocketManager
        {
     
     
     
     
           public static readonly Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            private static readonly List<Socket> clientSockets = new List<Socket>();
            private const int BUFFER_SIZE = 2048;
     
            private static readonly byte[] buffer = new byte[BUFFER_SIZE];
     
            public static void SetupServer()
            {
     
     
     
                IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
                IPAddress ipAddress = ipHostEntry.AddressList[0];
                ConsoleUtils.Write(ConsoleUtils.Type.DEBUG, $"Serveur lancé sur l'IP: {ipAddress}:{Config.LoginServerPort} ");
                serverSocket.Bind(new IPEndPoint(ipAddress, Config.LoginServerPort));
                serverSocket.Listen(0);
                serverSocket.BeginAccept(AcceptCallback, null);
     
            }
     
            private static void CloseAllSockets()
            {
                foreach (Socket socket in clientSockets)
                {
                    socket.Shutdown(SocketShutdown.Both);
                    socket.Close();
                }
     
                serverSocket.Close();
            }
     
            private static void AcceptCallback(IAsyncResult AR)
            {
                Socket socket;
     
                try
                {
                    socket = serverSocket.EndAccept(AR);
                }
                catch (ObjectDisposedException)
                {
                    return;
                }
     
                clientSockets.Add(socket);
                socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket);
                serverSocket.BeginAccept(AcceptCallback, null);
            }
     
            private static void ReceiveCallback(IAsyncResult AR)
            {
                Socket current = (Socket)AR.AsyncState;
     
                int received;
                try
                {
                    received = current.EndReceive(AR);
                }
                catch (SocketException)
                {
                    ConsoleUtils.Write(ConsoleUtils.Type.ERROR,"Connexion interrompue");
                    return;
                }
     
                byte[] recBuf = new byte[received];
                Array.Copy(buffer, recBuf, received);
                string text = Encoding.ASCII.GetString(recBuf);
                ConsoleUtils.Write(ConsoleUtils.Type.RECEIV, text);
     
                if(text.Contains(PacketEnums.RequêteClient))
                {
                    string s = text.Split('|')[1];
                    UpChat up = new UpChat();
                    up.Connect_client(s);
     
     
                }
                if (text.ToLower() == "aide")
                {
                    string aide = "Liste des commandes: " + Environment.NewLine +
                                  "- aide  - Aide generale" + Environment.NewLine +
                                  "- heure - Horloge du serveur" + Environment.NewLine +
                                  "- clore - Fermer le panel";
     
                    byte[] data = Encoding.ASCII.GetBytes(aide);
                    current.Send(data);
                    ConsoleUtils.Write(ConsoleUtils.Type.SEND, $"Commande envoyée au client");
                }
                else if (text.ToLower() == "clore")
                {
     
                    current.Shutdown(SocketShutdown.Both);
                    current.Close();
                    clientSockets.Remove(current);
                    ConsoleUtils.Write(ConsoleUtils.Type.INFO, "Client déconnecté");
                    return;
                }
                else
                {
     
     
                    ConsoleUtils.Write(ConsoleUtils.Type.WARNING, $"Packet {text} inconnu");
     
                }
     
                current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
            }
        }
    }

  16. #16
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Lui, on l'a. Mais on n'a pas le code où se trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IPAddress ipAdd = IPAddress.Parse(ip);
    IPEndPoint remoteEP = new IPEndPoint(ipAdd, 100);
                            soc.Connect(remoteEP);
                            byte[] byData = Encoding.ASCII.GetBytes(pam);
                            soc.Send(byData);
    C'est lui qu'il nous faut, en plus d'avoir le code du SocketManager. TOUT le code quoi, car pour l'instant, tu nous dis juste ça ne marche pas, mais on ne sait pas ni quand ni comment tu envoies tes données.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  17. #17
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    C'est le code SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    public void Connect_client(string ip)
            {
     
                try
                {
                    string sDatabase = $"server={Config.DatabaseHost};uid={Config.DatabaseUsername};pwd={Config.DatabasePassword};database={Config.UpName}";
                    string myCnnection = sDatabase;
                    MySqlConnection myCon = new MySqlConnection(myCnnection);
                    MySqlCommand SeectCommand = new MySqlCommand("select ip from client where ip=@ip", myCon);
                    SeectCommand.Parameters.AddWithValue("@ip", ip);
                    MySqlDataReader myReder;
                    myCon.Open();
                    myReder = SeectCommand.ExecuteReader();
                    int cout = 0;
                    while (myReder.Read())
                    {
                        cout = cout + 1;
                    }
                    if (cout == 1)
                    {
                        myCon.Close();
                        string pam;
                        MySqlCommand SeoectCommand = new MySqlCommand("select id from client where ip=@ip", myCon);
                        SeoectCommand.Parameters.AddWithValue("@ip", ip);
                        MySqlDataReader myReader;
                        myCon.Open();
                        myReader = SeoectCommand.ExecuteReader();
                        myReader.Read();
                        pam = myReader["id"].ToString();
                        try
                        {
                            byte[] byData = Encoding.ASCII.GetBytes(PacketEnums.AcceptClient + pam);
                            Network.SocketManager.serverSocket.Send(byData);
                            ConsoleUtils.Write(ConsoleUtils.Type.SEND, $"Envoi du packet {PacketEnums.AcceptClient} au client");
     
                        }
                        catch (Exception oo)
                        {
     
                            byte[] byData = Encoding.ASCII.GetBytes(PacketEnums.RefusClient + pam);
                            Network.SocketManager.serverSocket.Send(byData);
                            ConsoleUtils.Write(ConsoleUtils.Type.WARNING, $"Envoi du packet {PacketEnums.RefusClient} au client");
                            MessageBox.Show(oo.Message);
                            return;
                        }
                        myCon.Close();
                    }
                    else
                    {
     
                        Random random = new Random();
                        int num = random.Next(1000);
                        Ajout ajout = new Ajout();
                        ajout.id = num;
                        ajout.ipC = ip;
                        Client bdd = new Client();
                        bdd.inscription(ajout);
                        byte[] byData = Encoding.ASCII.GetBytes(PacketEnums.AcceptClient + num);
                        Network.SocketManager.serverSocket.Send(byData);
                        ConsoleUtils.Write(ConsoleUtils.Type.SEND, $"Envoi du packet {PacketEnums.AcceptClient} au client");
     
     
                    }
                }
                catch (Exception a)
                {
     
                    MessageBox.Show(a.Message, "Erreur d'application", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }

  18. #18
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Voilà, on y arrive. C'est un problème de conception.

    Il faut que tu modifies ta connexion au client par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    up.Connect_client(current);
    Et que tu modifies ensuite ta méthode Connect_client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void Connect_client(Socket socket)
            {
                // remplacer tous les "Network.SocketManager.serverSocket" par "socket"
               ...
            }
    Je t'invite à lire un bon tuto sur l'utilisation des sockets, car la manière que tu as de faire est erronée :
    • un client se connecte au serveur ;
    • le serveur ensuite essaie de se connecter au client.


    Ca, ça ne marche pas. Ce qu'il faut comprendre, c'est que lorsque le client se connecte au serveur, la communication est bilatérale, c'est-à-dire que :
    • le client peut envoyer/recevoir des données depuis le serveur ;
    • le serveur peut envoyer/recevoir des données depuis le client.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  19. #19
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    mai 2016
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : mai 2016
    Messages : 122
    Points : 42
    Points
    42

    Par défaut

    Cela fonctionne comme je veux, merci bien^^
    Aurais-tu le lien d'un tuto que tu recommanderais pour les sockets stp.?^^

  20. #20
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 417
    Points : 4 777
    Points
    4 777
    Billets dans le blog
    5

    Par défaut

    Je n'en ai pas sous la main, mais cela se trouve facilement

    Et n'oublie pas de passer le sujet en résolu si tout fonctionne !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2005, 23h36
  2. Problème de time-out avec un socket client.
    Par Depteam1 dans le forum MFC
    Réponses: 3
    Dernier message: 17/10/2005, 11h30
  3. Couper la connexion d'un socket client...
    Par Higestromm dans le forum Développement
    Réponses: 4
    Dernier message: 28/10/2004, 11h41
  4. Réponses: 2
    Dernier message: 12/10/2004, 14h04
  5. [SOCKET] Client C connecté à un serveur Java
    Par missllyss dans le forum Développement
    Réponses: 2
    Dernier message: 07/06/2004, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo