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

Réseau .NET Discussion :

Réception UDP avec des sockets


Sujet :

Réseau .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut Réception UDP avec des sockets
    Bonjour a tous
    Je suis nouveau sur le forum, donc je vous remercie tout de suite pour l'aide que vous allez pouvoir m'apporter.

    J'apprend tranquillement comment fonctionne les sockets pour mon projet final d'étude qui sera de la domotique.

    Présentement, j'arrive a envoyer et recevoir des données via les sockets en UDP. Seulement pour afficher les messages reçus, j'ai du mettre mon code dans un "click button", sinon mon code plantait toujours.

    Voici mon code de réception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      private void button4_Click(object sender, EventArgs e)
            {
     
                Byte[] rep = new Byte[32767];
                socket.Receive(rep);
                string srep = Encoding.ASCII.GetString(rep);
                textBox2.Text = srep;
     
            }
    Pourriez-vous m'aider a savoir comment recevoir et afficher automatiquement le message ?
    Merci
    Grégory

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Ca plantait avec exception , ou l'appli semblait bloquée ? Si c'est le second, c'est probablement dût au fait que Receive est bloquant : il va bloquer le thread jusqu'a ce qu'il ait des données (il y a moyen de mettre un timeout aussi). Pour ne pas bloquer, soit utiliser BeginReceive, ou faire du multi-thread.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut
    Salut GuruuMeditation;

    Je viens de faire le test et l'application semble bloqué, car je n'ai pas de message d'erreur.

    Comme je suis a la limite de mes connaissances en c#, qu'est ce qui serait le plus facile selon toi: BeginReceive ou multi-thread ?

    Je regardé les 2 ... et aucun n'a l'aire facile.

    Pour te guider, mon ordinateur va communiqué avec une carte arduino en UDP et la carte va devoir me retourné le statue ( lumière, chauffage...). C'est seulement ordi <=> arduino ou si tout fonctionne bien ordi <=> routeur <=> arduino.
    Merci
    Grégory

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Le plus simple est probablement avec le BeginReceive et EndReceive.

    L'idée est d'appeller le BeginReceive, ou tu va lui passer une méthode comme callback. Cette méthode sera appellée quand il recevra des données.
    Dans cette méthode, tu appelles le EndReceive pour pouvoir lire les données. Et tu relance un BeginReceive pour les données suivantes.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut
    Bonjour GuruuMeditation,

    J'ai trouvé sur internet plusieurs code qui parle de BeginReceive et EndReceive.
    Quand tu me parle d'une méthode qui s'appel callback, et ce que c'est la même chose que AsyncCallback ?

    Je voudrais me servir de ce projet pour bien comprendre BeginReceive et EndReceive car je trouve que c'est le seule que j'ai trouvé qui a l'air complet.

    Pour essayer de comprendre le code:
    il y a une fonction qui contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clientSocket.BeginReceive
    qui celle-ci contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AsyncCallback(RecieveComplete)
    . Ensuite, je ne sais pas trop quand mais la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RecieveComplete(IAsyncResult result)
    est appeler et dans celle-ci et de nouveau appeler ainsi de suite ?!?!
    Grégory

  6. #6
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Callback n'est pas le nom d'une méthode, mais cela veut dire que c'est une methode qui va être appellée après le traitement d'un autre process ou après un certain evenement.
    Un exemple (très simple, ecrit dans le train, donc non testé ):

    Code C# : 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
     
    public void StartListening()
    {
     ...
     socket.BeginReceive(buffer, 0, size, SocketFlags.None, CallbackMethod, null);
     ... 
    }
     
    // Fonction appellée de manière asynchrone quand des données sont reçues
    private void CallbackMethod(IAsyncResult ar) 
    { 
     //Récupérer la taille des données reçues
     var length = socket.EndReceive(ar);
     // lire buffer reçu ici
     ...
     // on relance la lecture
     socket.BeginReceive(buffer, 0, size, SocketFlags.None, CallbackMethod, null);
    }

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut
    Bonjour GuruuMeditation,

    J'ai essayé avec le code que tu m'as donné seulement ça ne marche pas. Le problème vient peut être du code que j'ai présentement. Ne soit pas surpris, c'est super simple comme code, mais est-ce que selon toi, il pourrait y avoir un problème

    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
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.77"), 80);
            }
     
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint endPoint;
            byte[] buffer;
            int Bouton = 0;
     
            private void button1_Click(object sender, EventArgs e)
            {
                string text = textBox1.Text;
                buffer = Encoding.ASCII.GetBytes(text);
                socket.SendTo(buffer, endPoint);
            }
            private void button4_Click(object sender, EventArgs e)
            { 
                Byte[] rep = new Byte[32767];
                socket.Receive(rep);
                string srep = Encoding.ASCII.GetString(rep);
                textBox2.Text = srep;  
            }
            private void button5_Click(object sender, EventArgs e)
            {
                if (Bouton == 0)
                {
                    button5.Text = "Déconnexion";
                    Bouton = 1;
                    socket.Connect(endPoint);
                }
                else
                {
                    button5.Text = "Connexion";
                    Bouton = 0;
                    socket.Close();
                }
     
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                socket.Close();
            }
     
     
        }    
    }
    Je mettre ton code à la suite et j’appellerai StartListening() a la connexion (button5_Click) du socket pour commencer la sorte de boucle que tu m'as expliquer dès la connexion.
    Est-ce que ça aurait du sens ?
    Merci
    Grégory

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut
    Bonjour
    Il y a déjà quelque temps que j'ai posé mes questions sur les sockets, mais j'en aurais encore quelques une.

    Présentement, j'ai relié mon ordinateur directement avec une carte arduino par un port ethernet et ma communication est numéro 1. Seulement, si je veux passé par le routeur pour communiqué avec cette carte et le wifi de mon ordi, cela ne marche plus ou presque. Quand je ping la carte arduino avec ms-dos en wifi, cela fonctionne (avant que je face quoi que ce soit d'autre). Mais des que je fais fonctionner mon programme, il ne se passe rien et je ne peux plus pingné la carte après pendant un certain temps et temps que mon programme fonctionne. Je me demandais si je devais spécifier une passerelle et un masque de réseau au programme pour que cela fonctionne ?
    Si oui, pourriez vous me donné une piste a suivre.
    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
     
    public Form1()
            {
                InitializeComponent();
     
                endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.77"), 80);  // Ip et port de destination 
            }
            Socket socket; // Nom de la fonction
            IPEndPoint endPoint; // adresse et port de destination
            byte[] buffer; // message qui sera  envoyer
            int Bouton = 0; // connexion/déconnexion
            int size = 20; // Définie le nb de caractère max a envoyer
     
            Byte[] rep = new Byte[32767]; // message réponce reçu 
            string stringData; // message réponce afficher
            string TextaEnvoyer; // Text 
            int recv; // Nombre de caractère recu
     
     
     
            private void button1_Click(object sender, EventArgs e)
            {
                if (Bouton == 0)//Connexion
                {
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  //Initialise la connexion udp
                    socket.BeginConnect(endPoint, new AsyncCallback(BeginConnect), socket);//Initialise réception asynchrone des messages
     
                    Bouton = 1;
                }
                else if (Bouton == 1)//déConnexion
                {
                    Bouton = 0;//Déconnexion
                    socket.Shutdown(SocketShutdown.Both);//Ferme le protocole 
                }
            }
            public void BeginConnect(IAsyncResult ar)//Reception asynchrone des messages
            {
                socket = (Socket)ar.AsyncState;
     
                    socket.BeginReceive(rep, 0, size, SocketFlags.None, new AsyncCallback(CallbackMethod), socket);
                    socket.EndConnect(ar);
            }
            private void CallbackMethod(IAsyncResult ar)//Reception asynchrone des messages
            {
                Socket remote = (Socket)ar.AsyncState;
                recv = remote.EndReceive(ar);
                socket.BeginReceive(rep, 0, size, SocketFlags.None, new AsyncCallback(CallbackMethod), socket);
                this.Invoke(new EventHandler(DisplayText));
            }
            private void DisplayText(object sender, EventArgs e)//Affiche les messages
            {
                stringData = Encoding.ASCII.GetString(rep, 0, recv);
                richTextBox1.Text += stringData + System.Environment.NewLine;
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                socket.Close();
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                TextaEnvoyer = textBox1.Text;
                buffer = Encoding.ASCII.GetBytes("<"+TextaEnvoyer+">");
                socket.SendTo(buffer, endPoint); //buffer= message en byte, endPoint est l'adresse de destination
            }
    Merci
    Grégory

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    Non, la passerelle est connue par ta stack IP a priori.

    Quand tu fais un tracert vers ta carte le passage par la passerelle est bien mentionné ?

    Je vois peut être un problème lié au fait que tu utilises le port HTTP en balançant des choses qui n'ont rien à faire sur ce port (UDP et contenu). Il est possible de le routeur écarte dans ce cas ces packets qu'il considére comme "louches". (sous toutes réserves).

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut
    Bonjour Bluedeep

    Quand tu me dis ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Quand tu fais un tracert vers ta carte le passage par la passerelle est bien mentionné ?
    Je ne suis pas sur de comprendre. Je n'ai pas fais une redirection vers ma carte dans mon routeur ( port 80 vers ma carte ). Si c'est cela que tu me demandais. Je ne pensais pas que cela été important.

    J'ai essayé de mettre mon programme sur un autre ordi pour communiquer entre pc, en changeant bien les adresse ip, mais cela ne fonctionne pas plus.

    Je vais essayer ta théorie de mettre un autre port, on ne sait jamais.
    Je t'en redonne des nouvelles.
    Merci
    Grégory

  11. #11
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Hello,

    Concernant les ports, je crois me souvenir que tous les ports de 0 à 1024 sont standardisés pour des utilisations bien précises (comme 80 pour le HTTP, par exemple). Habituellement, quand on développe des communications non-standards, on utilise un numéro de port au-dessus de 1024.

    A+!

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 53
    Par défaut
    Bonjour

    J'ai donc ouvert les port 2345 a 2346 pour mes 2 adresses ip (comme pour un serveur ftp par exemple).

    Ordi 1: visual studio
    Ordi 2: ordi 2 (lol)

    Quand j'ai mis mon programme sur ordi 2 et que j'ai voulu envoyer un message, le programme a planté. Sur l'ordi 1, tout fonctionne. Aucun message n'a été reçu.

    J'ai pris le fichier .exe qui ce trouve dans bin/debug.

    Je sais que si je connecte ma carte arduino sur le port ethernet cela fonctionne, donc on peut en déduire que temps que je ne passe pas par le routeur, cela fonctionne.

    Avez-vous une autre idée ?
    Merci
    Grégory

Discussions similaires

  1. pb réception UDP avec transfert rapide
    Par loup_precaire dans le forum Réseau
    Réponses: 4
    Dernier message: 23/03/2009, 21h22
  2. Quel langage pour faire un serveur avec des sockets
    Par CocoLeNain dans le forum Services
    Réponses: 3
    Dernier message: 15/03/2008, 18h04
  3. problème avec des sockets
    Par ddii dans le forum Réseau
    Réponses: 10
    Dernier message: 15/11/2005, 15h53
  4. Probleme avec des socket !
    Par Ptimath44 dans le forum Réseau
    Réponses: 11
    Dernier message: 31/10/2005, 18h11
  5. probleme de gestion de clients avec des sockets....
    Par ludvo dans le forum Réseau
    Réponses: 6
    Dernier message: 25/09/2003, 12h37

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