2010-06-18 5 views
1

У меня открытое TCP-соединение и чтение с использованием NetworkStream.BeginRead(). После того, как соединение будет закрыто с обоих концов, вызывается обратный вызов и объект потока бесполезен, как говорит документация, EndRead() выдает исключение IOException или ObjectDisposedException, в зависимости от того, на каком конце он завершил соединение..NET NetworkStream закрыт, как убедиться, что все данные прочитаны?

Гарантировано, что нет никаких данных, которые мне не хватает в промежутке между последним успешным EndRead (и повторным запуском) и отключением, особенно если я это сделаю в конце? Если это не так, в случае, если я заканчиваю закрытие соединения, мне нужно вручную отключить NetworkStream.Read(), чтобы убедиться, что ничего не осталось непрочитанным?

ответ

2

Образец, используемый в этом случае, предназначен для использования BeginRead для чтения потока (точно так же, как вы это делаете) и для обработки случая «больше данных в потоке» в методе обратного вызова.
Метод обратного вызова вызывает EndRead и собирает данные, считываемые из потока (обычно путем добавления его к экземпляру StringBuilder) , а затем снова вызывает BeginRead. Как только EndRead вернет 0 байт, это ваша гарантия, что больше нет данных для чтения из потока.

Вот документация может оказаться полезным: Using async client sockets

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

+0

Woo-hoo! Я знаю, что это правильно, но абсолютно никто не знает достаточно, чтобы подтвердить или отрицать! Подожди, почему я доволен этим? – Task

+0

Я собираюсь воскресить это в надежде, что, возможно, на этот (очень родственный) вопрос будет дан ответ: как «EndRead» произведет 0 байтов, если единственный способ «EndRead» вызывается в обратном вызове «BeginRead», который требует передачи данных для выполнения? Должен ли я просто отправить нулевой байтовый ответ? – Brandon

+0

Ну, теперь вы говорите о * записи * в поток, а не о чтении. Это совсем другое. У вас есть открытый вопрос для ссылки? По сути, вам не нужно специально писать нулевые байты, вам просто нужно завершить свой ответ. – Task

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