У меня 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 - моя главная потеря энергии