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. #1
    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 Problème de réception de trame via dialogue IP
    Bonjour,

    Je dialogue avec une carte Electronique en Ethernet. J'envoi une commande ST (de statut), mais je dois cliquer plusieurs fois sur envoyer pour recevoir l'intégralité de ma trame.

    J'ai donc fait ce petit test: attendre que je reçoive ! ou ? pour return le message reçu...

    Sauf que cela fait une boucle infinie... ce caractère "!" correspond à une commande comprise par le panneau (Ack), à l'inverse Nack, cependant quand j'envoi une commande il ce peu que je reçoive "!" dans un premier Click ou un début de réponse STAT mais pas tout, il faut que je reclick pour avoir l'intégralité de la réponse de l'UC!

    Voici le 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
    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();
     
     
            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];
                    int nbrlu=serveurStream.Read(inStream, 0, clientSocket.ReceiveBufferSize);
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbrlu);
     
                    foreach (byte b in inStream)
                    {
                        if (b.ToString().Equals("!") || b.ToString().Equals("?"))
                        {
                            messagerecu(returndata);
                            TB_MessageEnvoye.Text = "";
                            TB_MessageEnvoye.Focus();
                        }
                    }
     
                }
                catch 
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                public void messagerecu(string msg)
                {
                    TB_MessageReçu.Text=TB_MessageReçu.Text + msg;
     
                }
     
            private void Initializetimertestpicto()
            {
                timertestpicto.Enabled=true;
                timertestpicto.Interval=60000;
            }
     
     
     
        }
    }
    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
    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];
                    int nbrlu=serveurStream.Read(inStream, 0, clientSocket.ReceiveBufferSize);
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbrlu);
     
                    /*foreach (byte b in inStream)
                    {
                        if (b.ToString().Equals("!") || b.ToString().Equals("?"))
                        {
                            messagerecu(returndata);
                            TB_MessageEnvoye.Text = "";
                            TB_MessageEnvoye.Focus();
                        }
                    }*/
                    messagerecu(returndata);
                    TB_MessageEnvoye.Text = "";
                    TB_MessageEnvoye.Focus();
                }
    Quand je compile avec ce code:

    J'envoi par un click: ST et je reçois: STAT il faut que je reclick sur le bouton envoyer pour avoir: STATUS ADR=010 BTR=0 CKS=0FAD COD=I0106.0 CTL=0 EDF=0 ER0=00 ER1=00 ER2=00 ERI=I0052/4.0.15/0 EVT=ERI:20/03/15 09:08:16 GAR=000 GAT=0 GEN=LAX.PA1 INI=015 LOC=CARROS MOV=0 NST=2004 RST=023 TRM=0 VER=001!

    Merci, amis experts csharp de m'aiguiller sur le sujet!

    Cordialement,

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est plus une question de connaissance sur le protocole tcp/ip


    celui ci envoi les données par paquets
    déjà si le truc de l'autre côté renvoie un acquittement puis réfléchit quelques microsecondes avant d'envoyer les infos, il t'aura fait 2 envoies, et toi tu ne lis qu'une fois ce qu'il y a dans le buffer
    avec un autre clic tu lis simplement la suite du buffer qui t'attendais déjà
    s'il prend du temps à répondre un acquittement tu n'auras même rien à lire avec ton code
    de plus un paquet peut tout à fait être coupé en plusieurs morceaux, surtout si l'envoi est gros
    dans le principe, le logiciel remplit le buffer, le buffer est envoyé, le logiciel met la suite, qui est envoyée etc... et le buffer ne fait que quelques kilos
    mais même si tu veux envoyer 2 octets (= 2 caractères en ascii) et que le matériel a des soucis de collisions à ce moment là et que dans le buffer il ne reste qu'un octet de libre, tes 2 caractères seront envoyés en 2 fois


    aussi il convient de "lire" en continue ou mieux d'utiliser les méthodes asynchrones qui te préviennent quand il y a quelque chose à lire
    et de concaténer tout ce que tu reçois puis découper une trame en fonction soit d'une longueur, soit d'un caractère de fin de trame (ou autre)
    et après seulement traiter la trame

    mais écrire puis lire tout de suite ce n'est pas la chose à faire

    ou si tu veux faire un truc tout moche, tu attends une bonne seconde après avoir écrit avant de lire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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, merci pour ta réponse! Je vais revoir mon code, je reviendrais surement vers toi

  4. #4
    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 ne sais pas qu'elle méthode utiliser... les threads? c'est compliquer je ne comprend pas comment mettre ça en place. ou faut il utiliser async et await? Lire en continue? c'est à dire byte/byte ?

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le plus simple c'est les méthodes asynchrone
    genre .beginread
    à celle ci tu donnes une adresse de retour (un callback)
    quand il y a quelque chose à lire, la méthode est appelée, et dans ce void tu lis les données, que tu enregistres quelque part (genre concaténer dans une variable de classe)
    et à la fin de la lecture, il faut rappeler .beginread avec le même callbak, comme ca s'il y a à nouveau quelque chose à lire ca repassera ici et concaténera de nouveau

    et après concaténation, tu regardes ce que la variable contient, si tu vois une trame entière, tu la supprimes de cette concaténation et tu la traites
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    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
    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
     
                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;
                    Object state;
                    serveurStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, callback, state);
     
     
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, );
                    messagerecu(returndata);
    j'ai un peu de mal... :s

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en même temps des variables à null ^^

    en c# ca doit ressembler à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AsyncCallback callback = new AsyncCallback (un void que tu dois écrire)
    concernant le state (object), en fait tu mets ce que tu veux dedans, ca permet de le retrouver dans le callback (donc pas toujours utile, celui là tu dois pouvoir le laisser à null)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    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'aider, je ne comprend pas comment utiliser cette 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
    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);
                    Object state;
                    serveurStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, state);
     
     
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, );
                    messagerecu(returndata);
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                public 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)
            {
     
            }

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    rien à mettre après le beginread (donc supprimer string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, ); messagerecu(returndata)

    dans la méthode Fluxentrant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int32 nbOctetsLus = clientSocket.EndRead(result);
    if (nbOctetsLus !=0 )  
     {
       string returndata = System.Text.Encoding.ASCII.GetString(outStream , 0, nbOctetsLus);
       messagerecu(returndata);
       clientSocket.GetStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, null);
     }
    ca doit donner à peu près ca

    endread retourne le nombre d'octets lus
    si nb octetts lus = 0 ca veut dire demande de fermeture du port par l'autre côté (donc éventuellement mettre un else et faire quelque chose)
    après il faut déplacer outstream en variable de classe pour y avoir accès ailleurs (ou alors le placer dans state, le truc qu'on met dans state se retrouve dans result.AsyncState (à caster donc))

    si ton buffer est plus grand que le nombre d'octets retournés, les valeurs restent à 0 à partir du "dépassement" d'où l'utilité de récupérer le nombre d'octets lus
    si ton buffer est plus petit que le nombre d'octets arrivant, le callback sera rappelé tout de suite
    appeler begintread à nouveau ici sert à ca, et/ou au fait que l'autre côté peut renvoyer quelque chose plus tard
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    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
    J'ai des erreurs dans la méthode Fluxentrant.. sur EndRead, OutStream, GetStream, InStream n'existant pas dans le contexte actuelle, using manquant..
    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
    namespace Liaison_IP
    {
     
     
        public partial class Form1 : Form
        {
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
     
     
            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);
                    Object state=outStream;
                    serveurStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, state);
     
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                public 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.EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(outStream, 0, nbOctetsLus);
                    messagerecu(returndata);
                    clientSocket.GetStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, null);
                }
            }
     
        }
    }

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en même faire du copier coller sans réfléchir n'a jamais fait du code qui marche ...

    certes je me suis trompé j'ai écris outstream au lieu de instream, mais j'ai dit qu'il fallait déplacer la déclaration de outstream
    et il y a surement d'autres erreur de copier coller dans ce que j'ai fournit mais adapte le code, car le principe est là
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    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, merci. C'est pas simple quand on débute. Je suis à l'écoute pour pouvoir évoluer. J'ai essayer de le déclarer en globale mais ça me met un message d'erreur...

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    chercher à adapter un code n'empeche pas de reposter derrière si on galère
    c'était surtout pour t'expliquer le principe qu'il faut comprendre un code qu'on prend sur le net plutot que d'espérer qu'il va marcher (bien que des fois il marche )
    donc remet nous le code et le message d'erreur (avec la ligne concernée)

    et j'avais pas vu la balise "débutant" mais quand je vois du code avec des try catch et du tcp je ne devine pas forcément que j'ai affaire à un débutant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    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
    J'essaye de faire de mon mieu, mais je ne suis pas très alaise surtout que ce que je fait n'est pas le plus élémentaire, try catch c'est quand même essentielle pour que l'appli ne soit pas bloquante.

    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
    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();
     
     
            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);
                    Object state=outStream;
                    serveurStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, state);
     
                }
                catch
                {
                    MessageBox.Show("erreur d'envoi", "erreur");
                }
            }
     
                public 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.EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
                    messagerecu(returndata);
                    clientSocket.GetStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, null);
                }
            }
     
        }
    }
    Erreur 2 Le nom 'inStream' n'existe pas dans le contexte actuel
    Erreur 4 Le nom 'inStream' n'existe pas dans le contexte actuel
    Erreur 3 'System.Net.Sockets.TcpClient.GetStream()' est un 'méthode', qui n'est pas valide dans le contexte donné
    Erreur 1 'System.Net.Sockets.TcpClient' ne contient pas une définition pour 'EndRead' et aucune méthode d'extension 'EndRead' acceptant un premier argument de type 'System.Net.Sockets.TcpClient' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante*?)

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    déplacer byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
    en dessous de System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();

    supprimer Object state=outStream;

    serveurStream.BeginRead(inStream, 0, clientSocket.ReceiveBufferSize, Fluxentrant, state);
    à remplacer par
    serveurStream.BeginRead(inStream, 0, inStream.length, Fluxentrant, null);
    (ca ne change rien, mais c'est plus propre, si tu changes la taille du buffer (c'est au choix) tu ne la changeras qu'à un endroit)

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     public void Fluxentrant(IAsyncResult result)
            {
                int nbOctetsLus = clientSocket.GetStream.EndRead(result);
                if (nbOctetsLus != 0)
                {
                    string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
                    messagerecu(returndata);
                    clientSocket.GetStream.BeginRead(inStream, 0, inStream.length, Fluxentrant, null);
                }
            }
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public partial class Form1 : Form
        {
     
            System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
            byte[] inStream = new byte[clientSocket.ReceiveBufferSize];
    J'avais déjà essayer de le déclarer à cet endroit mais message d'erreur: que ce soit dessus ou dessous de System.Net... .
    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'

  17. #17
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    messagerecu(returndata);
    Quand je veux afficher le message j'appelle cette fonction:

    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;
                }
    Sauf que ce n'est pas le même thread. Comment gérer cela??

  18. #18
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en vb.net ca serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TB_MessageReçu.invoke(sub() TB_MessageReçu.Text = TB_MessageReçu.Text + msg)
    je te laisse trouver l'équivalent en c#
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    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 utiliser un délégué à ce que je comprend!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void messagerecu(string msg)
                {
                    TB_MessageReçu.Text=TB_MessageReçu.Text + msg;
                }
    Invoke(messagerecu, null);

  20. #20
    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
    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
    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();
     
                    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 messagerecu(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);
                    //messagerecu(returndata);
                    Invoke();
                    clientSocket.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                }
            }
     
     
        }
    }
    J'essaye pas mal de choses mais ça ne marche pas, peux tu m'aider s'il te plaît.

    Merci d'avançe!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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, 20h45
  2. Problème de réception via TCP
    Par Guispeed4262 dans le forum Réseau
    Réponses: 7
    Dernier message: 29/12/2010, 11h38
  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, 15h50
  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, 17h45
  5. Réponses: 3
    Dernier message: 29/08/2003, 10h57

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