Почему NetworkStream.DataAvailable всегда верно? - PullRequest
0 голосов
/ 06 марта 2011

Я открываю TcpClient и затем вызываю tcpClient.GetStream().Read(message, 0, 8), чтобы прочитать сообщения из соединения.

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

В чем может быть причина?

Заранее благодарю за помощь!

1 Ответ

1 голос
/ 06 марта 2011

Трудно ответить, не видя обоих концов канала (но, в частности, отправляющий конец). DataAvailable действительно только указывает состояние локального буфера (но не самого потока); с точки зрения определения конца потока он в значительной степени бесполезен (т сообщает о чем-то не связанном).

I ожидаю это ошибка в передающем коде. Классическая ошибка здесь следующая:

var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0, buffer.Length);

Когда это должно быть:

var buffer = memoryStream.GetBuffer();
networkStream.Write(buffer, 0,
    (int)memoryStream.Length);

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

...