TcpClient.Connected Always True

У меня довольно простая архитектура клиент / сервер с использованием TCP-клиента. Сервер настроен на закрытие соединений от клиентов, от которых он не получил сообщение в течение двух минут. Я убедился, что это нормально работает, используя TCP-клиент C ++ для моего устройства Android. Однако мой клиент C # всегда кажется подключенным, даже после того, как сервер закрывает соединение.

Я пробовал множество вещей, и ни один из них, похоже, не сообщает точно, что соединение было закрыто. TcpClient.Connected всегда возвращает истину, даже после отправки и получения сообщений, в отличие от того, что указано в документации MSDN. Код клиента C #:

var client = new TcpClient(server, port);
var stream = client.GetStream();

//Wait >2 mins to get disconnected
await Task.Delay(Timespan.FromMinutes(2.5));

void Write()
{
    try
    {
        var data = BuildByteArrayFromMyData();
        stream.Write(data , 0, data.Length);

        if(!client.Connected)
        {
            //Never triggered, Connected always equals true
        }
    }

    catch(Exception ex)
    {
        //Never triggered
    }
}

void ReadOnAnotherThread()
{
    while (true)
    {
        try
        {
            while (!stream.DataAvailable)
            {
                if (!client.Connected) break; //Never triggered, Connected always equals true
                else await Task.Delay(TimeSpan.FromMilliseconds(11));
            }

            byte[] data = new byte[];
            int bytes = stream.Read(data, 0, data.Length);
         }
    }

    catch(Exception ex)
    {
        //Never triggered
    }
}

В: Как правильно использовать TcpClient.Connected?


Подобные вопросы, которые НЕ отвечают на предложенный здесь вопрос:



person lolcodez    schedule 23.10.2014    source источник
comment
добавленный вами код не имеет особого смысла ... Я не вижу, чтобы вы закрывали соединение, как вы утверждаете, что делаете   -  person Leo    schedule 23.10.2014
comment
Это клиентский код. Соединение закрывается сервером.   -  person lolcodez    schedule 23.10.2014
comment
Не существует правильного способа использования TcpClient.Connected. Это очень вводящее в заблуждение имя свойства, которое на самом деле должно называться TcpClient.UsedToBeConnectedAtSomePointInThePastAndAsFarAsIKnowItStillIsButImNotSure. Другими словами, это практически бесполезно. Для обнаружения разорванных соединений лучше всего отправлять данные через регулярные промежутки времени, так как I опишите в моем блоге.   -  person Stephen Cleary    schedule 23.10.2014