Partage
  • Partager sur Facebook
  • Partager sur Twitter

Socket (c#)

    11 mars 2020 à 13:50:20

    Bonjour, j'ai recement apris a faire de la communication socket. J'ai commencer par un petit programme tres simple avec un serveur qi envoi du text au client et le cleint qui l'affiche. Mais ensuite j'ai voulu ajouter que le client puisse repondre (chaque programme enverrais des données chaqun leurs tour). Voici mon code :

    Le serveur :
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net.Sockets;
    using System.Net;
    
    namespace serveur
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("lancement du serveur");
                string port = "8080";
                string ip = "127.0.0.1";
                Socket MonSocketServeur = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint MonEP = new IPEndPoint(IPAddress.Parse(ip), Convert.ToInt32(port));
                MonSocketServeur.Bind(MonEP);
                MonSocketServeur.Listen(1);
                while (true)
                {
                    Socket SocketEnvoi = MonSocketServeur.Accept();
                    Console.WriteLine("connection effectuer depuis l'ip : " + MonEP.Address);
                    //si le compilateur arrive jusque la, c'est qu'une connection a été effectuer
                    try
                    {
                        while (true)
                        {
                            Console.WriteLine("que voulez vous envoyer ?");
                            string tempo = Console.ReadLine();
                            Byte[] msg = System.Text.Encoding.ASCII.GetBytes(tempo);
                            int Envoi = SocketEnvoi.Send(msg); //Envoie
                            Console.WriteLine(Envoi + " bytes envoyés au client");
                            Byte[] MesBytes00 = new Byte[255]; //sera transphormer en tableau avec toutes les donnée apres "Receive"
                            try
                            {
                                MonSocketServeur.Receive(MesBytes00);
                            }
                            catch (Exception e) { Console.WriteLine(e); }
                            string données = System.Text.Encoding.ASCII.GetString(MesBytes00);
                            Console.WriteLine(données);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("impossible d'envoyer les données \n");
                    }
                }
            }
        }
    }

     Le client :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    using System.Threading;
    using System.Diagnostics;
    using System.IO;
    
    namespace client
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("lancement du client");
                string port = "8080";
                string ip = "127.0.0.1";
                Socket MonSocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint MonEP = new IPEndPoint(IPAddress.Parse(ip), Convert.ToInt32(port));
                while (true)
                {
                    try
                    {
                        MonSocketClient.Connect(MonEP);
                        Console.WriteLine("connection au serveur réussi");
                        //si le compilateur arrive jusque la, c'est que la connection a bien été effectuer
                        Byte[] MesBytes = new Byte[255]; //sera transphormer en tableau avec toutes les donnée apres "Receive"
                        try
                        {
                            while (true)
                            {
                                MonSocketClient.Receive(MesBytes);
                                string données = System.Text.Encoding.ASCII.GetString(MesBytes);
                                Console.WriteLine(données); //Affichage
                                Console.WriteLine("et vous, que souaitais vous envoyer ?");
                                string tempo = Console.ReadLine();
                                Byte[] msg = System.Text.Encoding.ASCII.GetBytes(tempo);
                                int Envoi = MonSocketClient.Send(msg);
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("impossible de récuperer les donnée :/" + e);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("impossible de se connecter au serveur" + e);
                    }
                    System.Threading.Thread.Sleep(10000);
                }
            }
        }
    }



    L'erreure se produit sur le serveur au moment juste apres l'envoi des premieres données (c'est le serveur qui commence a envoyer des données). Enfin plus précisément a la 39 eme ligne :

    MonSocketServeur.Receive(MesBytes00);
     L'erreure est : "System.Net.Sockets.SocketException (0x80004005): Une requête d'envoi ou de réception de données n'a pas été autorisée car le socket n'est pas connecté et (lors de l'envoi sur un socket datagramme en utilisant un appel sendto) aucune adresse n'a été fournie"

    Je n'y connais vraiment pas grand chose je débute et j'imagine que mon erreure est peu complexe a régler mais voila ^^

    Merci d'avance ^^


    (PS: ds pour les fautes de français)

    -
    Edité par Comeriox 11 mars 2020 à 13:53:01

    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2020 à 14:56:27

      Je pense que vous devriez un peu revoir vos cours sur les réseaux. ;)

      Le message d'erreur vous apparaitra limpide.

      Et votre Design complètement à côté de la plaque.

      Comment voulez-vous que votre serveur contacte les clients AVANT que les clients ne le contact, et donc lui fournissent l'adresse IP et le port TCP d'écoute du dit client ?

      P.S.: Virez-moi toutes attentes actives "while(true)" et autres "try/catch(Exception){...}".

      -
      Edité par bacelar 11 mars 2020 à 15:00:59

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        11 mars 2020 à 15:35:15

        Je dois avouer que j'ai fait tres peu de socket ^^ je suis peu etre aller un peut vite ^^ Mais je n'ai pas vraiment compris votre réponses, comment sa "lui fournissent l'adresse IP et le port TCP d'écoute du dit client ?" ?

        • Partager sur Facebook
        • Partager sur Twitter
          11 mars 2020 à 19:00:18

          Ce n'est pas un problème de "socket".

          Ce que vous tentez de faire n'a même pas de sens d'un point de vue "réseaux".

          Pour envoyer un truc en TCP/IP, il faut une adresse IP et un port TCP de départ (ça, les sockets le font pour vous), mais aussi une adresse IP et un numéro de port TCP de destination.

          Dans votre "Architecture", comment votre programme "serveur" est sensé récupérer ces @IP et numéro de port TCP de destination, lors de son envoie de données ?

          -----

          OUUPS!!!!, je viens de regarder le code. Je m'étais juste basé sur le message d'erreur et vos "explications".

          Mon laïus est bon mais votre code ne respecte pas vos dires (ou je les interprète mal).

          Le problème est ligne 39 du serveur, il faut utiliser la socket de communication "SocketEnvoie" qui dispose des informations dont j'ai parlé ci-avant.

          En utilisant la socket d'écoute "MonSocketClient", vous n'avez ces informations sur le point d'entré distant pour pouvoir envoyer des données.

          La socket d'écoute "MonSocketClient" ne sart qu'à "écouter" => permet de créer une autre socket (une de communication) lors de la demande de connexion par un client.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            11 mars 2020 à 19:20:40

            Ok je pense avoir compris, mais du coup je ne suis pas sur d'avoir compris ce que je dois faire :/ en gros je dois crée dans le client une variable "Socket SocketEnvoi = MonSocketClient.Accept();" et ensuite faire SocketEnvoi.send(msg); ?

            -
            Edité par Comeriox 11 mars 2020 à 19:21:05

            • Partager sur Facebook
            • Partager sur Twitter
              12 mars 2020 à 11:25:30

              J'ai dit un peu nimpornawak, entre vos dire, le code et mon état de fatigue, bref.

              Non, c'est dans le code serveur qu'il faut faire une modification, ligne 39.

              SocketEnvoi.Receive(MesBytes00);



              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                12 mars 2020 à 18:59:11

                A ok ^^ Merci beaucoup pour votre aide ^^ j'ai réussi du coup ^^
                • Partager sur Facebook
                • Partager sur Twitter

                Socket (c#)

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown