Auteur de questions
StreamSocket bi directionnel

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
Toutes les réponses
-
-
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
- Modifié Samuel LIOULT vendredi 11 décembre 2015 09:32
-
-
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é.
-
-
-
-
-