C # обнаружение TCP-клиента исчезло - PullRequest
0 голосов
/ 02 октября 2018

У меня TCPServer работает так:

await Task.Run(() =>
{
    try
    {
        client = tcpClient;

        bool Stop = false;
        byte[] response = new byte[1024];
        while (!ServerController.Token.IsCancellationRequested && !Stop)
        {
            Array.Clear(response, 0, response.Length);
            var amount = tcpClient.Client.Receive(response);
            string data = Encoding.UTF8.GetString(response);
            if (amount == 0)
            {
                Stop = true;
                ServerController.Token.ThrowIfCancellationRequested();
            }
            else
                ProcesNewMessage(data);
        }
        if (ServerController.Token.IsCancellationRequested)
        {
            tcpClient.Close();
            ServerController.Token.ThrowIfCancellationRequested();
        }
    }
    catch (Exception exc)
    {
        tcpClient.Close();

        Debug(exc.Message);
        ServerController.Token.ThrowIfCancellationRequested();
    }

}, ServerController.Token).ContinueWith(
    (result) =>
    {
        clientDisconnected?.Invoke(this, EventArgs.Empty);
    });
}

Во-первых, токен отмены не работает.Я предполагаю, что это для другого вопроса.

Моя проблема - обнаружение выходных сокетов.В случае хорошего закрытия сокета на другой стороне я получаю ноль байтов (кешируется в переменной amount), но действительно неприятный сценарий - неожиданные отключения от клиента (выключение, закрытие терминала и т. Д. И т. Д.)Как я могу их обнаружить?

Мои клиенты Arduino похожи на фишки, поэтому они могут неожиданно умереть.Как я могу это заметить?

PS: Я бы хотел избежать сердцебиения, так как мои устройства работают на батарейках, а отправка через WiFi - моя главная потеря энергии

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