Чтение данных из сокета в C#

Рейтинг: 1Ответов: 1Опубликовано: 08.02.2011

Как корректно и без костылей считать данные из сокета?
До этого писал на C++/Qt и там был замечательный метод QTcpSocket::readAll() который возвращал все что было передано в сокет, в шарпе из подобного увидел только StreamReader.ReadToEnd(), но он выкидывает исключение мол этот объект не поддерживает seeking(или как-то так).
В гугле нашел только способы которые предлагают отлавливать окончание данных посредством try{}catch{}, но мне кажется это просто грубые кривые костыли.
В общем буду рад любой помощи по данному вопросу.
P.S.: А в Qt все было так просто, понятно и логично...

Ответы

▲ 2Принят

Если вам правда надо прочесть всё, что пришло (это редко нужно, на самом деле), то вы можете использовать свойство Socket.Available. Получив количество готовых байт вы можете выделить буффер нужного размера и прочесть всё, что готово.

В Java мне не раз приходилось работать с сокетами и я что-то не припомню, чтобы available мне хоть раз понадобился.. общая схема всегда одна и та же: делаю буффер и читаю в него, пока не закончится. Так что мне вообще не понятно, зачем вам read all.

Что же до try/catch - это действительно выглядит как костыль. Не ведитесь на такие советы.