Pourquoi serait BufferedStream.Write jeter « Ce flux ne supporte pas les opérations de recherche »?

StackOverflow https://stackoverflow.com/questions/3095640

Question

Celui-ci me déconcerte. Je reçois une erreur au sujet de chercher quand je ne suis même pas l'appeler?

J'ai du code qui ressemble à ceci:

// send 42
uint value = 42;
byte[] msg = BitConverter.GetBytes(value);
stream.Write(msg, 0, sizeof(uint));

et je reçois cette exception:

System.NotSupportedException was unhandled
Message="This stream does not support seek operations."
Source="System"
StackTrace:
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count)
...

flux est de type System.IO.BufferedStream. Que pourrait-il se passer?

modifier plus d'informations:

sizeof(uint)==msg.length dans ce cas.
Le flux est déclaré comme stream = new BufferedStream(new NetworkStream(socket), 1024)

edit:

C'était-ce! Alors que l'on peut lire et écrire sur un seul NetworkStream, lors du passage à un BufferedStream il est nécessaire d'avoir un autre pour la lecture et l'écriture. On peut apparemment juste appeler le constructeur NetworkStream deux fois sur le même socket pour obtenir cela.

J'accepte à la fois Justin et les réponses de Hans si je pouvais, parce qu'on me permettre de comprendre exactement ce qui était faux, et l'autre m'a conduit à la solution. tout le monde Merci!

Était-ce utile?

La solution

Les mensonges de problème dans le fonctionnement interne de BufferedStream (et le fait que vous avez peut-être utilisé le BufferedStream à lire à partir avant de tenter d'y écrire).

Lorsque vous essayez d'écrire dans un BufferedStream, après avoir validé vos paramètres, les choses sont vérifiés dans cet ordre (tout le code tiré du Cadre via réflecteur):


Sommes-nous à la mendicité du tampon d'écriture?

if(this._writePos == 0)

Sommes-nous autorisés à écrire dans le flux sous-jacent?

if(!this._s.CanWrite) // throw error

est le tampon de lecture vide?

if(this._readPos < this._readLen)
{
    // FlushRead() will attempt to call Seek()
    this.FlushRead();
}

En cas de données non lues dans la mémoire tampon de lecture, une quinte flush est tentée avant d'écrire. appels FlushRead () seek (), qui est la cause de votre erreur .

Autres conseils

Vous devez avoir été en train de lire plus tôt de cette BufferedStream. Il obtient ses octets d'un NetworkStream. Ce sont à sens unique, vous pouvez seulement lire ou écrire seulement à eux, selon la façon dont ils ont été créés. Postez le code qui a créé le NetworkStream si vous avez besoin de plus d'aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top