C # BinaryReader.ReadString на сетевом сокете - PullRequest
1 голос
/ 07 октября 2011

У меня есть приложение сервер / клиент.

Оба используют BinaryReader / Writer при общении.

Когда клиент и сервер обмениваются сообщениями быстро, многие через определенную секунду, и я выключаю сервер (с помощью встроенной команды, упорядоченное завершение работы) большую часть времени (но не всегда) клиентского BinaryReader.ReadString () Метод генерирует EndOfStreamException, что нормально. Я не понимаю, почему это исключение не изменяет свойство TcpClient.Connected на «false»?

while(true){
   try{
      BinaryReader.ReadString()
   }
   catch(IOException){
     if(!TcpClient.Connected)
        break;
     //BinaryWriter.Write() - this will, eventually, change Connected property to 'false'
   }
}

Это зациклится бесконечно. Я думал, что свойство Connected изменяется при неудачном чтении / записи в сети. Если BinaryReader генерирует исключения, значит, он не читается успешно?

Если я добавлю BinaryWriter.Write (), то бесконечный цикл прерывается, потому что свойство Connected изменяется на «false».

Смежный вопрос, всегда ли EndOfStreamException указывает на разорванное сетевое соединение или это может означать временную проблему?

1 Ответ

2 голосов
/ 07 октября 2011

По замыслу. Из раздела «Примечания» статьи библиотеки MSDN для TcpClient.Connected:

Поскольку свойство Connected отражает только состояние подключение с самой последней операции, вы должны попытаться отправить или получите сообщение для определения текущего состояния. После сообщения отправить не удалось, это свойство больше не возвращает true. Обратите внимание, что это Поведение - это дизайн. Вы не можете достоверно проверить состояние соединение, потому что во время между тестом и отправкой / получением, связь могла быть потеряна. Ваш код должен предполагать Разъем подключен, и изящно обрабатывает неудачные передачи

Обнаруженный вами обходной путь правильный.

...