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 :

Problème de réception de trame via dialogue IP [Débutant]


Sujet :

C#

  1. #21
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    this.Invoke(new MethodInvoker(delegate
    					{
    						this.TB_MessageReçu.Text += msg;
     
    					}));

  2. #22
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Citation Envoyé par mck74 Voir le message
    ça ne marche pas
    pas très explicite ...

    tu peux aussi faire du debug (pas à pas, point d'arret ...) pour avoir savoir où ça ne se passe pas comme tu le souhaiterais
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    ça ne marche pas, en parlant de l'affichage du message reçu je suis toujours sur le même topic. Si je savais ce qui ne va pas je ne viendrais pas chercher de l'aide. Merci pour vos réponse. oui, merci c'est ce que j'essaye de faire par contre je n'arrive pas à voir ce que j'ai dans mes variables.

    j'ai besoin d'explication, j'ai déjà du mal en c# alors passer par du VBA ça me noie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void messagerecu(string msg)
                {
                    TB_MessageReçu.Text = TB_MessageReçu.Text + msg;
                }
    j'ai cette fonction qui me permet d'afficher la trame reçu.

    Sauf que:
    j'utilise la méthode .BeginRead qui utilise un thread secondaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
     
     
                    AsyncCallback callback=new AsyncCallback(Fluxentrant);
                    serveurStream.BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
    je ne peux donc pas utiliser l'appelle de cette fonction il faut que je passe par un delegate

    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
    messagerecu(returndata);

    Mais la comment faire, je trouve de tout et je n'arrive pas à me faire des convictions!

    Faut il créer un delegate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void messagerecu(string msg);
    Puis créer une méthode pour ce delegate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void messagerecu(string msg)
                {
                    TB_MessageReçu.Text = TB_MessageReçu.Text + msg;
                }
    Pour la déclaration de inStream, si je fait comme Pol m'as dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
    j'ai cette erreur:
    Erreur 1 Un initialiseur de champ ne peut pas faire référence au champ, à la méthode ou à la propriété non statique 'Liaison_IP.Form1.clientSocket'

    Voici l'intégralité du code:
    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO;
    using System.Net.Sockets;
    using System.Net;
     
     
    namespace Liaison_IP
    {
     
     
        public partial class Form1 : Form
        {
     
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
            byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
     
            public Form1()
            {
                InitializeComponent();
     
     
            }
     
            private void BP_Connect_Click(object sender, EventArgs e)
            {
                try
                {
                    clientSocket.Connect("X.X.X.X", 2101);
                    lb_Etatduport.Text="Port ouvert";
                }
                catch
                {
                    MessageBox.Show("erreur de connexion", "erreur");
                }
            }
     
            public void BP_Envoyer_Click(object sender, EventArgs e)
            {
                NetworkStream serveurStream = clientSocket.GetStream();
                byte[] outStream = System.Text.Encoding.ASCII.GetBytes(TB_MessageEnvoye.Text+'\r');
                try
                {
     
                    serveurStream.Write(outStream, 0, outStream.Length);
                    serveurStream.Flush();
     
                    byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
     
     
                    AsyncCallback callback=new AsyncCallback(Fluxentrant);
                    serveurStream.BeginRead(inStream, 0, inStream.Length, Fluxentrant, null); 
     
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                public delegate void messrec(string msg);
     
                private void messagerecu(string msg)
                {
                    TB_MessageReçu.Text = TB_MessageReçu.Text + msg;
                }
     
            private void Initializetimertestpicto()
            {
                timertestpicto.Enabled=true;
                timertestpicto.Interval=60000;
            }
     
            public void Fluxentrant(IAsyncResult result)
            {
                int nbOctetsLus = clientSocket.GetStream().EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
     
                    messrec Rec=messagerecu;
     
                    clientSocket.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                }
            }
     
     
        }
    }

  4. #24
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Citation Envoyé par mck74 Voir le message
    ça ne marche pas, en parlant de l'affichage du message reçu je suis toujours sur le même topic. Si je savais ce qui ne va pas je ne viendrais pas chercher de l'aide.
    et pourtant là pour le même problème je comprends que c'est le delegate qui te pose soucis

    Citation Envoyé par mck74 Voir le message
    j'ai besoin d'explication, j'ai déjà du mal en c# alors passer par du VBA ça me noie.
    moi c'est du vb.net que j'ai mis, rien à voir avec vba, c'est un langage de la famille .net comme c#, et il existe des traducteurs pour passer de l'un à l'autre sur le web
    quand je peux j'écris en c# ici, mais je ne prend pas toujours le temps

    Citation Envoyé par mck74 Voir le message
    Pour la déclaration de inStream, si je fait comme Pol m'as dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
    j'ai cette erreur:
    Erreur 1 Un initialiseur de champ ne peut pas faire référence au champ, à la méthode ou à la propriété non statique 'Liaison_IP.Form1.clientSocket'
    oui enfin moi j'ai fait un copier coller te ton code que j'ai déplacé, mais je n'aurais jamais écrit ca
    ce que le compilateur veut te dire c'est qu'il ne veux pas ici que la déclaration dépende d'une autre variable
    aussi mettre une valeur en dur corrige le problème (c'est 8192 que contient cette propriété par défaut pour info)


    concernant le delegate quelqu'un d'autre t'as répondu en haut de page avec la syntaxe c#
    éventuellement je peux ajouter l'explication du principe qu'il y a derrière
    en .net il n'est pas autorisé de modifier un controle depuis un autre thread que celui l'ayant créé (le thread principal)
    pour repérer ca chaque controle a une propriété InvokeRequired qui retourne true si actuellement on est dans un autre thread
    et pour s'en sortir les controles ont une méthode invoke qui permet de dire au thread principal de prendre le relais pour faire un truc (donc pause le thread autre)
    il faut donc lui donner un pointeur vers une méthode, qui peut etre anonyme
    à l'époque il fallait un délégué, depuis ms a simplifié la syntaxe avec les méthodes anonymes (même si ca revient au même)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #25
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    D'accord chef!

    Mettre une valeur en dur c'est pas très flexible, c'est pour ça que j'aurais voulu que la taille de mon tableau soit dimensionner en fonction de ce qu'il reçoit, et ne pas mettre une valeur au hasard comme 15000. Comment le faire alors? le byte 8192? c'est quoi? la longueur maxi? c'est une propriété?

    Donc en utilisant la syntaxe de Lead que je remercie ça fonctionne, pas besoin de créer une fonction? délégué ni méthode.

    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
    public void BP_Envoyer_Click(object sender, EventArgs e)
            {
                NetworkStream serveurStream = clientSocket.GetStream();
                byte[] outStream = System.Text.Encoding.ASCII.GetBytes(TB_MessageEnvoye.Text+'\r');
                try
                {
     
                    serveurStream.Write(outStream, 0, outStream.Length);
                    serveurStream.Flush();
     
                    byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
     
     
                    AsyncCallback callback=new AsyncCallback(Fluxentrant);
     
                    serveurStream.BeginRead(inStream, 0, inStream.Length, Fluxentrant, null); 
     
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                public delegate void messrec(string msg);
     
                private void messagerecu(string msg)
                {
                    TB_MessageReçu.Text = TB_MessageReçu.Text + msg;
                }
     
            private void Initializetimertestpicto()
            {
                timertestpicto.Enabled=true;
                timertestpicto.Interval=60000;
            }
     
            public void Fluxentrant(IAsyncResult result)
            {
                int nbOctetsLus = clientSocket.GetStream().EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
     
                    messrec Rec=messagerecu;
     
                    clientSocket.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                }
            }
     
     
        }
    }
    A aucun moment je passe dans
    Fluxentrant(IAsyncResult result)

  6. #26
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Citation Envoyé par mck74 Voir le message
    Mettre une valeur en dur c'est pas très flexible, c'est pour ça que j'aurais voulu que la taille de mon tableau soit dimensionner en fonction de ce qu'il reçoit, et ne pas mettre une valeur au hasard comme 15000. Comment le faire alors? le byte 8192? c'est quoi? la longueur maxi? c'est une propriété?

    instream est un tableau d'octet
    quand on défini un tableau on défini la taille maximum de ce tableau
    au début tu avais mis tcpclient.receivebuffersize comme taille maxi
    receivebuffersize est une propriété, qui si tu le modifies pas vaut 8192, donc mettre 8192 revient au même

    mais ceci ne change rien au fontionnement, tu peux mettre ce que tu veux comme valeur et avoir le même fonctionnement
    comme dit précédemment ceci est un buffer, donc un espace temporaire
    beginread démarre un thread qui attend une réception
    quand il recoit des octets, il vide le buffer de la carte réseau dans ton ta variable tableau d'octet
    si ta variable est plus grande, le tableau contient des 0 après la taille de ce que as recu, d'où l'utilité de connaitre le nombre d'octets lus pour pouvoir ne prendre que ca dans sont traitement
    si ta variable est plus grande, ton tableau est rempli, un si tu refais un beginread, le callback est appelé tout de suite avec la suite
    donc avec un buffer 1 octet ca reviendrait au même si tu concatènes tout ce que tu recois
    mais tout ca je l'ai déjà dit, il ne faut pas hésiter à relire plusieurs fois un truc pour le saisir, ca m'éviterait de l'écrire plusieurs fois
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #27
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Parfait!! Merci beaucoup

  8. #28
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Comment gérer une communication avec plusieurs équipements? Je voudrais interroger un par un les équipements.

  9. #29
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    avec plusieurs tcpclient et une boucle
    éventuellement faire une classe qui encapsule les paramètres (ip et autres), le tcpclient, et le dialogue
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #30
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Il faut donc que je fasse une Socket par équipement? Autant de Socket que d'équipement? J'ouvre la première Socket, j'envoi ma commande, quand je n'ai plus d'octets à lire, je traite et je ferme ma Socket et je passe à une autre Socket? assez fastidieux...

    J'ai une erreur en ce moment:
    Une exception non gérée du type 'System.ObjectDisposedException' s'est produite dans System.dll

    Informations supplémentaires*: Impossible d'accéder à un objet supprimé.
    Je me connecte, j'envoi une commande, je me déconnecte et quand je ferme ma fenêtre ce message d'erreur apparaît!

    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO;
    using System.Net.Sockets;
    using System.Net;
     
     
    namespace Liaison_IP
    {
     
     
        public partial class Form1 : Form
        {
     
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
            byte[] inStream = new byte[15000];
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void BP_Connect_Click(object sender, EventArgs e)
            {
                try
                {
                    clientSocket.Connect("X.X.X.X", 2101);
                    lb_Etatduport.Text="Port ouvert";
                }
                catch
                {
                    MessageBox.Show("erreur de connexion", "erreur");
                }
            }
     
            public void BP_Envoyer_Click(object sender, EventArgs e)
            {
                NetworkStream serveurStream = clientSocket.GetStream();
                byte[] outStream = System.Text.Encoding.ASCII.GetBytes(TB_MessageEnvoye.Text+'\r');
                try
                {
                    serveurStream.Write(outStream, 0, outStream.Length);
                    serveurStream.Flush();
                    AsyncCallback callback=new AsyncCallback(Fluxentrant);
                    serveurStream.BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                private void messagerecu(string msg)
                {
                    TB_MessageReçu.Text = TB_MessageReçu.Text + msg;
                }
     
            private void Initializetimertestpicto()
            {
                timertestpicto.Enabled=true;
                timertestpicto.Interval=60000;
            }
     
            private void Fluxentrant(IAsyncResult result)
            {
                int nbOctetsLus = clientSocket.GetStream().EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
                    clientSocket.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                    this.Invoke(new MethodInvoker(delegate
                    {
                        this.TB_MessageReçu.Text = TB_MessageReçu.Text+returndata;
     
                    }));
     
                }
            }
     
            private void BP_Deconnecter_Click(object sender, EventArgs e)
            {
                try
                {
                    if (clientSocket.Connected) clientSocket.Close();
                    lb_Etatduport.Text="Port Fermé";
                }
                catch 
                {
                    MessageBox.Show("erreur de deconnexion", "erreur");
                }
            }
        }
    }

  11. #31
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    il y a des chances qu'une fois le socket fermé il faille en réinstancier un autre (new)

    par contre il n'est pas utile de le fermer si tu dois encore l'utiliser

    et il n'y a rien de fastidieux si tu codes ca bien

    comme je disais si tu fais un classe dans laquelle tu déplaces le code ca ne te fais très peu de code à ajouter
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Peux tu m'aiguiller un peu plus s'il te plaît

    Merci pour tout!

  13. #33
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    faire une classe qui encapsule les paramètres (ip et autres), le tcpclient, et le dialogue
    si tu sais faire une classe ca devrait aller
    dans le constructeur de cette classe tu demandes en paramètres l'ip, le port
    tu ranges ca dans des variables locales
    ton tcp client en variable locale, que tu connectes dans le constructeur (begin read pareil)
    une propriété public qui contient ce que tu recois

    et dans ton form
    tu instancies cette classes autant de fois que nécessaire
    et dans un 1er temps sur un timer tu ranges le contenu de chaque instance.propriétéMessageRecu dans un textbox pour voir si ca marche

    après tu adaptes à tes besoins
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'ai vraiment du mal, voici ma classeIP:
    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
    namespace Liaison_IP
    {
        class ClasseIP
        {
            NetworkStream serveurStream = client.GetStream();
     
            static void Connect(string server, string message)
            {
                Int32 port;
                TcpClient client = new TcpClient(server, port);
            }
     
            public void Messagerecu()
            {
                //NetworkStream serveurStream = clientSocket.GetStream();
                byte[] inStream = new byte[15000];
                client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
            }
        }
    }
    Dans le form:
    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
    namespace Liaison_IP
    {
     
     
        public partial class Form1 : Form
        {
     
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
            byte[] inStream = new byte[15000];
     
            public Form1()
            {
     
                InitializeComponent();
            }
     
            private void TESTCOM()
        {
            try
            {
                NetworkStream serveurStream = clientSocket.GetStream();
                byte[] outStream = System.Text.Encoding.ASCII.GetBytes("\r");
                serveurStream.Write(outStream, 0, outStream.Length);
                serveurStream.Flush();
     
     
                AsyncCallback callback = new AsyncCallback(Fluxentrant);
                serveurStream.BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
            }
            catch
            {
                MessageBox.Show("erreur de com","erreur");
            }
        }
     
            private void BP_Connect_Click(object sender, EventArgs e)
            {
                try
                {
                    clientSocket.Connect("X.X.X.X", 2101);
                    lb_Etatduport.Text = "Port ouvert";
                    TESTCOM();
                }
                catch
                {
                    MessageBox.Show("erreur de connexion", "erreur");
                }
            }
     
            public void BP_Envoyer_Click(object sender, EventArgs e)
            {
     
                try
                {
                    NetworkStream serveurStream = clientSocket.GetStream();
                    byte[] outStream = System.Text.Encoding.ASCII.GetBytes(TB_MessageEnvoye.Text+'\r');
                    serveurStream.Write(outStream, 0, outStream.Length);
                    serveurStream.Flush();
     
     
                    AsyncCallback callback=new AsyncCallback(Fluxentrant);
                    serveurStream.BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                private void messagerecu(string msg)
                {
                    TB_MessageReçu.Text = TB_MessageReçu.Text + msg;
                }
     
            private void Initializetimertestpicto()
            {
                timertestpicto.Enabled=true;
                timertestpicto.Interval=60000;
            }
     
            private void Fluxentrant(IAsyncResult result)
            {
                int nbOctetsLus = clientSocket.GetStream().EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
                    clientSocket.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                    this.Invoke(new MethodInvoker(delegate
                    {
                        this.TB_MessageReçu.Text = TB_MessageReçu.Text+returndata;
     
                    }));
     
                }
     
            }
     
        }
    }
    Sachant que je n'arrive pas à fermer ma socket comme dit dans un message précédent.
    Pour interroger plusieurs équipements quand j'ai terminer de recevoir il faut bien que je ferme ma socket et en instancier une autre, avec d'autre paramètre IP et un numero de port.

    Au secours!

  15. #35
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    pas eut le temps de lire le code
    mais non tu n'es pas obligé de fermer le socket pour dialoguer avec un autre équipement
    tu peux ouvrir plusieurs sockets en même temps (et heureusement)
    d'ailleurs tu peux même interroger tous tes équipements en même temps (pas chacun leur tour)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #36
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    quelle est la finalité ? genre lire des infos sur des équipements et les afficher sur des labels ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    la finalité étant d'analyser la réponse des équipements, les commandes envoyées seront pour tester l'état technique de l'équipement, suite à cette réponse, animer les équipements sur un synoptique par code couleur avec un libellé sur l'état technique, présence d'un défaut...

    D'ailleurs à partir d'un fond de carte, je ne vois pas comment faire pour permettre à l'utilisateur d'ajouter, placer et configurer l'équipement qui pourrait être de plusieurs types.

  18. #38
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Je pensais que fermer le socket était nécessaire pour ne pas perturber le réseau. mais alors pourquoi fermer le socket?

  19. #39
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Citation Envoyé par mck74 Voir le message
    Je pensais que fermer le socket était nécessaire pour ne pas perturber le réseau. mais alors pourquoi fermer le socket?
    si tu as besoin d'interroger quelque chose toutes les secondes, il n'y a aucune raison de fermer le socket
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #40
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 29
    Points : 7
    Points
    7
    Par défaut
    Je bloque pour cette classe, peux tu me faire un petit exemple s'il te plaît. A partir de cette classe l'instancier dans le form.. j'ai du mal

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Problème de réception de données via QTcpSocket
    Par bilou_2007 dans le forum Débuter
    Réponses: 12
    Dernier message: 16/04/2011, 21h45
  2. Problème de réception via TCP
    Par Guispeed4262 dans le forum Réseau
    Réponses: 7
    Dernier message: 29/12/2010, 12h38
  3. Affichage incomplet après réception d'une trame via RS232
    Par sroge dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/02/2008, 16h50
  4. [Configuration] problème de réception de mail via formulaire
    Par FraK dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 26/06/2007, 18h45
  5. Réponses: 3
    Dernier message: 29/08/2003, 11h57

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