Вопрос

Этот озадачивает меня. Я получаю сообщение об попытке, когда я даже не звоню?

У меня есть код, который выглядит примерно так:

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

И я получаю это исключение:

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)
...

Поток имеет тип System.IO.BufferedStream. Анкет Что может продолжаться?

Редактировать с дополнительной информацией:

sizeof(uint)==msg.length в таком случае.
Поток объявлен как stream = new BufferedStream(new NetworkStream(socket), 1024)

редактировать:

Это было! Хотя можно прочитать и писать на одном NetworkStream, при переходе на BufferedStream Нужно иметь отдельный для чтения и письма. Можно, по-видимому, просто позвонить NetworkStream Конструктор дважды на одном и том же сокете, чтобы получить это.

Я бы принял как ответы Джастина, так и Ганса, если бы я мог, потому что один позвольте мне точно понять, что не так, а другой привел меня к решению. Спасибо всем!

Это было полезно?

Решение

Проблема заключается в внутренней работе буферизованного потрафа (и то, что вы, возможно, использовали буферный потерю, чтобы прочитать от до попытки написать ему).

Когда вы пытаетесь написать в буферист, после проверки ваших параметров, в этом порядке все проверяется (весь код, вытащенный из структуры через отражатель):


Мы на просьбе буфера записи?

if(this._writePos == 0)

Разрешено ли нам писать в базовый поток?

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

Является ли прочитанный буфер пустой?

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

Если в буфере прочитанного буфера есть непрочитанные данные, флеш предпринимается перед записью. Scomead () звонки ищут (), Что вызывает вашу ошибку.

Другие советы

Вы должны были читать ранее из этого буфера. Это получает свои байты из сетевого потока. Это одностороннее, вы можете либо читать только из или только писать им, в зависимости от того, как они были созданы. Опубликуйте код, созданный сетевой тел, если вам нужна дополнительная помощь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top