Тестирование, если NetworkStream закрыт - PullRequest
2 голосов
/ 16 января 2009

У меня есть класс, который упаковывает экземпляр Stream, поэтому я могу использовать его для упаковки FileStreams и NetworkStreams. Теперь я хочу проверить, доставляет ли поток какие-либо данные, другими словами, я хочу проверить NetworkStream, если он еще подключен, или FileStream, если он достиг своего конца.

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

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 16 января 2009

Stream.Read не должен выдавать исключение в конце; это возвращает что-то не положительное. Я просто читаю (...) до тех пор, пока не получу обратно, то есть

int read;
while((read = stream.Read(buffer, 0, buffer.Length) > 0) {
    // process "read"-many bytes
}

Обратите внимание, что NetworkStream имеет DataAvailable - но это относится к буферу , а не к самому потоку (как обсуждено здесь ). Я упоминаю об этом только для того, чтобы вы не пытались использовать его, чтобы увидеть, закрыт ли поток, поскольку это не то, что он означает.

Если вы оберните Stream в StreamReader, вы можете использовать Peek или EndOfStream для проверки на закрытие:

bool isEnd = reader.EndOfStream;

или

int b = reader.Peek();
if(b < 0) {... was end ...}
0 голосов
/ 05 ноября 2012

NetworkStream вернет EOF (Read вернет 0 байтов), когда другая сторона закроет сокет.

0 голосов
/ 16 января 2009
stream.CanRead
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...