Как обнаружить сбой соединения TCP, используя свойство NetworkStream.DataAvailable? - PullRequest
0 голосов
/ 04 мая 2020

При использовании Socket для TCP попытка чтения данных при потере соединения приведет к исключению. Я привык использовать исключения, чтобы знать, когда происходит сбой операции TCP, поскольку вы не можете с уверенностью сказать, что соединение разорвано, за исключением попыток чтения / записи.

Но я только что заметил, что NetworkStream.DataAvailable просто возвращает false в этом случае, и TcpClient.GetStream также успешно возвращается. У меня есть код, подобный следующему (используется в опросе-l oop) - есть ли способ расширить этот подход для обнаружения сбойных соединений?

    public int Read()
    {
        var stream = tcp.GetStream();
        if (!stream.DataAvailable)
            return 0;
        else
            return stream.Read(InBuffer, 0, InBuffer.Length);
    }

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

1 Ответ

1 голос
/ 04 мая 2020

Нет.

Видите, вы получаете исключение при разрыве соединения.

DataAvailable может просто не иметь данных, доступных В МОМЕНТ. Пакеты занимают много времени, и пакеты могут потеряться TCP имеет механизм для повторной отправки пакетов списка, но это вызывает задержку.

GetStream возвращает поток. Это ваша конечная точка. Он возвращает его, когда соединение доступно, что имеет смысл. DataAvailable существует, чтобы проверить, есть ли ожидающие данные. Данные, которые не ждут, НЕ являются потерянным соединением - это данные, которые не ждут.

...