none
StreamSocket bi directionnel RRS feed

  • Question

  • Bonjour à toutes et tous,

    Je travaille actuellement sur les sockets avec Windows 10 en utilisant donc la classe StreamSocket.

    J'arrive donc à me connecter puis envoyer des données, et même recevoir une réponse.

    Mon problème est lorsque je veux répéter cette action plusieurs fois, au bout d'un moment un Stream se retrouve fermé et cela ne fonctionne plus. Je vous mets mon code :

    Le seveur :

    private async void _listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
            {
                DataReader reader = new DataReader(args.Socket.InputStream);
                DataWriter writer = new DataWriter(args.Socket.OutputStream);
                try
                {
                    while (_run)
                    {
                        // Read first 4 bytes (length of the subsequent string).
                        uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
                        if (sizeFieldCount != sizeof(uint))
                        {
                            // The underlying socket was closed before we were able to read the whole data.
                            return;
                        }
    
                        // Read the string.
                        uint stringLength = reader.ReadUInt32();
                        uint actualStringLength = await reader.LoadAsync(stringLength);
                        if (stringLength != actualStringLength)
                        {
                            // The underlying socket was closed before we were able to read the whole data.
                            return;
                        }
    
                        string data = reader.ReadString(actualStringLength);
                        ParseData(data);
                        
                        writer.WriteUInt32(writer.MeasureString("received!"));
                        writer.WriteString("received!");
    
                        try
                        {
                            busy = true;
                            await writer.StoreAsync();
                        }
                        catch (Exception e)
                        {
                            Log(e.Message);
                        }
                    }
    
                    //reader.DetachStream();
                    //reader.Dispose();
    
                    //writer.DetachStream();
                    //writer.Dispose();
                }
                catch (Exception exception)
                {
                    // If this is an unknown status it means that the error is fatal and retry will likely fail.
                    if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
                    {
                        Log("Unknown socket error: " + exception.Message);
                    }
                    else
                    {
                        Log(exception.Message);
                    }
                }
            }

    Et le client :

    public async Task<string> Send(string data)
            {
                DataWriter writer = new DataWriter(_socket.OutputStream);
                writer.WriteUInt32(writer.MeasureString(data));
                writer.WriteString(data);
    
                DataReader reader = new DataReader(_socket.InputStream);
                string response = null;
                try
                {
                    await writer.StoreAsync();
    
                    Log("datas sent: " + data);
                    
                    uint sizeFieldCount = await reader.LoadAsync(sizeof(uint));
                    if (sizeFieldCount != sizeof(uint))
                    {
                        // The underlying socket was closed before we were able to read the whole data.
                        return null;
                    }
    
                    // Read the string.
                    uint stringLength = reader.ReadUInt32();
                    uint actualStringLength = await reader.LoadAsync(stringLength);
                    if (stringLength != actualStringLength)
                    {
                        // The underlying socket was closed before we were able to read the whole data.
                        return null;
                    }
    
                    string datar = reader.ReadString(actualStringLength);
    
                    Log("response: " + datar);
                    response = datar;
                }
                catch (Exception e)
                {
                    Log("send failed with message: " + e.Message);
                }
    
                return response;
            }

    Merci,

    Samuel

    jeudi 10 décembre 2015 15:22

Toutes les réponses

  • Bonjour Samuel,

    Le problème vient du client qui n'arrive plus à envoyer les données ou du serveur, qui n'arrive plus à les recevoir ?

    Merci,


    Thomas Lebrun [MVP] - Windows 8 / Windows Phone / WPF / SL: http://blog.thomaslebrun.net

    vendredi 11 décembre 2015 08:15
  • Bonjour Thomas,

    Merci de votre intérêt.

    Il s'agit du client qui n'arrive plus à envoyer. Voici l'erreur :

    Exception levée : 'System.ObjectDisposedException' dans FlorenceLib.ni.DLL

    The object has been closed. (Exception from HRESULT: 0x80000013)

    Et je ne vois pas bien dans mon code, où le flux a pu être fermé.

    Merci


    vendredi 11 décembre 2015 09:31
  • Juste une idée, mais j'ai déjà vu des transferts interrompus à cause de l'anti-virus...

    Est-ce que le contenu du transfert importe?


    Cyrille Precetti

    vendredi 11 décembre 2015 13:04
  • Bonjour Cyrille,

    Merci pour la proposition mais je doute fort que cela vienne de l'antivirus car cela fonctionne sur les premiers transferts. J'ai plus l'impression qu'il y a un moment où il essai de lire et écrire en même temps et que cela pose problème, entrainant une fermeture du flux ?

    J'ai essayé d'empêcher cette possibilité en utilisant des flags pour éviter de faire les deux en même temps mais cela n'a pas fonctionné.

    vendredi 11 décembre 2015 13:39
  • Bonjour,

    Toujours pas d'idée pour mon problème ? Mon implémentation n'est peut être pas correcte...

    Merci de votre aide.

    Samuel

    jeudi 17 décembre 2015 12:20
  • Je viens de regarder ce que MSDN dit sur StreamSocketListener et j'ai l'impression qu'à l'origine c'était pour windows app...

    Est-ce que tu as regardé à utiliser plutôt tcpListener?


    Cyrille Precetti

    jeudi 17 décembre 2015 13:01
  • Bonjour Cyrille,

    Je l'utilise justement dans une Windows app. Plus précisément pour Windows IoT.

    Merci

    vendredi 18 décembre 2015 10:07
  • Est-ce que tcpListener est disponible pour IoT?, normalement c'est disponible pour .NET 4 et up...


    Cyrille Precetti

    vendredi 18 décembre 2015 16:59
  • TcpListener n'est pas disponible pour les applications universelles Windows 10.

    Je pense qu'il faut utiliser StreamSocket, et qu'il doit y avoir une petite erreur dans mon implémentation.

    samedi 19 décembre 2015 11:53