NetworkStream.BeginRead при разрыве соединения с клиентом - PullRequest
0 голосов
/ 13 мая 2011

Я получил поток клиента TCP, который читается через асинхронный вызов NetworkStream.BeginRead (передача делегата асинхронного обратного вызова).Проблема заключается в обнаружении, когда соединение не работает.В настоящее время, если соединение разорвано, вызов BeginRead просто исчезает в эфире - обратный вызов просто не вызывается.Если приложение попытается отправить поток, пока он выключен, вызывает обратный вызов, и NetworkStream.EndRead выдает исключение - это нормально - но если отправка не выполняется, приложение просто сидит в темноте, не подозревая, чтосоединение разорвано.

Изначально я увидел, что NetworkStream.ReadTimout не был установлен (т. е. был по умолчанию Timout.Infinite) - но установка этого значения (скажем, 3000 мс) не помогла.[Редактировать: в документе MSDN четко указано, что ReadTimeout применяется только к синхронному вызову Read, а не к asyn BeginRead - я должен был проверить это более тщательно ранее :-(]

Как определить, что клиентское соединение не удалось?

Нужно ли опрашивать базовый сокет, как показано в этом вопросе SO ?

Кроме того: Когда физически восстанавливается соединение, обратный вызовдо сих пор не звонят - мы просто сидим и ждем в эфире, пока не попробуем отправить.

1 Ответ

0 голосов
/ 11 апреля 2012

В итоге мне пришлось перейти с асинхронного TcpClient BeginRead на синхронный Read с таймаутом для выделенного чтения Thead.

Это позволило мне вызвать событие, когда истекло время ожидания из-за отсутствия данных в потоке.

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