IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Freeze socket client


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    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 : 135
    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
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    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.

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    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 : 135
    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
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    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

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    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 : 135
    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
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    ok, alors d'où vient la variable "soc" dans le premier code ?

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

Discussions similaires

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

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