2012-02-10 4 views
1

У меня есть приложение на основе сокетов, которое предоставляет полученные данные объекту BinaryReader на стороне клиента. Я пытаюсь отладить проблему, когда данные, содержащиеся в считывателе, не чисты ... то есть буфер, который я читаю, содержит старые данные за размером новых данных.Странное поведение с BinaryReader

В приведенном ниже коде:

System.Diagnostics.Debug.WriteLine("Stream length: {0}", _binaryReader.BaseStream.Length); 
byte[] buffer = _binaryReader.ReadBytes((int)_binaryReader.BaseStream.Length); 

Когда я закомментировать первую строку, данные не в конечном итоге быть грязным (или, не в конечном итоге быть грязным, как регулярно), а когда у меня есть это утверждение строки печати. Насколько я могу судить, со стороны сервера данные поступают чистым образом, поэтому вполне возможно, что у моей реализации сокета есть некоторые проблемы. Но есть ли у кого-нибудь идеи, почему добавление этой линии печати приведет к загрязнению данных чаще?

+0

длина байтов должна быть длинной длины .. где вы объявляете это ...? – MethodMan

+0

Например, если бы я хотел прочитать байты, я бы сделал что-то вроде следующего FileStream fs = File.OpenRead (inputfilepath); байт [] buffer = новый байт [fs.Length]; fs.Read (буфер, 0, buffer.Length); как пример – MethodMan

+0

Я не знаю, как это применимо ... Насколько я знаю, ReadBytes выделяет буфер и возвращает его. – sohum

ответ

1

Ваш двоичный считыватель выглядит как частная переменная-член (если ведущее подчеркивание является значком tell tell).

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

+0

Это участник, но у меня он защищен 'AutoResetEvent'. – sohum

0

Вы уверены, что ваша логика чтения верна? Stream.Length указывает длину всего потока, а не оставшихся данных для чтения.

Предположим, что изначально было доступно 100 байт. Length - 100, а BinaryReader исправляет чтение 100 байт и продвигает позицию потока на 100. Затем поступают еще 20 байтов. Length - теперь 120; однако ваш BinaryReader должен читать только 20 байтов, а не 120. «Дополнительные» 100 байтов, запрошенные во втором чтении, либо заставляют его блокировать, либо (если поток не выполняется правильно) прерываются.

0

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

+0

Кажется довольно близким к «если другой поток пытается использовать его и при написании сценария», упомянутом выше. В любом случае, хорошая вещь, которую вы нашли! – Anastasiosyal

+0

Согласовано. Отмечено как ответ. – sohum

Смежные вопросы