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 communication Tcp/ IP c#


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 communication Tcp/ IP c#
    Bonjour,

    Voici l'erreur:
    Une exception de première chance de type 'System.InvalidOperationException' s'est produite dans System.dll
    System.InvalidOperationException: Impossible d'appeler BeginConnect pendant qu'une autre opération asynchrone est en cours sur le même Socket.
    à System.Net.Sockets.Socket.DoMultipleAddressConnectCallback(Object result, MultipleAddressConnectAsyncResult context)
    à System.Net.Sockets.Socket.DoDnsCallback(IAsyncResult result, MultipleAddressConnectAsyncResult context)
    à System.Net.Sockets.Socket.BeginConnect(String host, Int32 port, AsyncCallback requestCallback, Object state)
    à System.Net.Sockets.TcpClient.BeginConnect(String host, Int32 port, AsyncCallback requestCallback, Object state)
    à WindowsFormsApplication1.Equipement.Connect()
    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
           public void Messageecrit(string message)
            {
     
                    try
                    {
                        // pas d'écriture si pas connecté au client
                        if (!client.Connected)
                        {
                            if (!Connect()) return;
                        }
                        try
                        {
                            byte[] outstream = System.Text.Encoding.ASCII.GetBytes(message);
                            client.GetStream().Write(outstream, 0, outstream.Length);
                        }
                        catch
                        {
     
                        }
                    }
                    catch
                    {
     
                    }
            }
     
            /// <summary>
            /// Ouvre la connection IP vers le client et lance la scrutation des flux entrants
            /// </summary>
            public bool Connect()
            {
     
                if (!IPAddress.TryParse(sAdresse_IP, out ipaddr)) AddrIsValid = false;
                //this.port = iPort;
                client.SendTimeout = 5000;
                client.ReceiveTimeout = 5000;
     
                IAsyncResult ar;
     
                if (AddrIsValid == false) return false;
                // connection
                try
                {
                    // tente une connection
                    ar = client.BeginConnect(sAdresse_IP, iPort, null, null);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("{0} Exception caught.", ex);
                    return false;
                }
                //attent 1 seconde
                bool Success = ar.AsyncWaitHandle.WaitOne(1000, false);
     
                // pas de lecture si pas connecté au client
                if (!client.Connected) return false;
     
                try
                {
                    // lancement de la méthode asynchrone de lecture des flux entrants 
                    client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                    return true;
                }
     
                catch (Exception ex)
                {
                    Console.WriteLine("{0} Exception caught.", ex);
                    return false;
                }
     
            }
     
            /// <summary>
            /// procédure appelé lors d'un flux entrant
            /// </summary>
            /// <param name="result"></param>
            private void Fluxentrant(IAsyncResult result)
            {
                if (client != null)
                {
                    int nbOctetsLus;
                    try
                    {
     
                        //Affectation du nombre d'octets disponible à la fin de lecture de l'opération asynchrone
                        nbOctetsLus = client.GetStream().EndRead(result);
     
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("{0} Exception caught.", ex);
                        nbOctetsLus = 0;
                    }
     
                    if (nbOctetsLus != 0)
                    {
                        // converti les octets lus en chaine de caractère
                        string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
                        // on ajout les caractères reçus aux éventuelles trames déjà reçu précédemment
                        TramesRecues += returndata;
                        DecompositionMessagesReçus();
                    }
                    else
                    {
                        bEtat = false;
                        //Console.WriteLine("Etat=false");
                        change();
                    }
                    // relance l'écoute des flux entrants suivants
                    try
                    {
                        if (client.Connected)
                        {
                            IAsyncResult ar = client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("{0} Exception caught.", ex);
                    }
                }
            }
    Cordialement,

    Milles merci à celui qui pourrais me débloquer, et à tout autre personne ayant pris de son temps

  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
    le message dit que tu ne peux pas appeler beginconnect quand un autre beginquelquechose est en court
    ca veut dire 2 choses, que ca plante sur le beginconect, et que tu as fais un autre begin avant
    j'imagine que c'est un autre beginconnect (ca serait idiot de faire un beginread ou beginwrite avant d'être connecté, ca aurait ralé aussi d'ailleurs)
    donc que tu serais passé 2x fois sur cette ligne de code, donc genre tu as voulu envoyer 2 choses mais sans que tout se passe dans l'ordre requis

    ce qui veut dire que ton code est à revoir, soit pour le rendre plus synchrone, soit plus asynchone

    en fait beginconnect ne me semble pas être une instruction utile, connect tout court doit pouvoir utiliser un timeout, donc soit ca se connecte tout de suite et tu envoies, soit ca ne se connecte pas et tu ne fais rien d'autre
    (beginsend ne doit être utile que pour une gros volume de données, beginread par contre est très utile)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    en fait beginconnect ne me semble pas être une instruction utile, connect tout court doit pouvoir utiliser un timeout, donc soit ca se connecte tout de suite et tu envoies, soit ca ne se connecte pas et tu ne fais rien d'autre
    (beginsend ne doit être utile que pour une gros volume de données, beginread par contre est très utile)
    Non, les versions asynchrones de ces méthodes sont toujours utiles. Parfois le réseau est lent, et ça prend du temps de se connecter ou d'envoyer des données, même en petit volume.

    Par contre les méthodes BeginX/EndX ne sont vraiment pas pratiques à utiliser, si possible il vaut mieux utiliser les méthodes XAsync si elles existent, avec async/await. Cela dit, dans le cas de Socket, les méthodes XAsync datent de .NET 4.0 et ne suivent pas le pattern TAP (task asynchronous pattern), donc on ne peut pas les utiliser avec async/await... il faut créer des méthodes qui wrappent BeginX/EndX, avec Task.Factory.FromAsync.

Discussions similaires

  1. Probléme de communication TCP/IP avec fonction send bloqué
    Par TheToune dans le forum Développement
    Réponses: 0
    Dernier message: 21/09/2011, 10h05
  2. Problème communication SOCKET Réseau TCP/IP
    Par gcniko dans le forum Langage
    Réponses: 6
    Dernier message: 15/09/2010, 10h43
  3. [ServerSocket]Problème communication client-serveur udp sur linux
    Par gdecrouez dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/09/2006, 14h59
  4. Problème de communication TCP/IP
    Par Gouyon dans le forum Développement
    Réponses: 4
    Dernier message: 01/07/2006, 18h55

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