У меня проблема с методом Socket.SendAsync, не обнаруживающим мертвое TCP-соединение. В моем клиентском/серверном приложении сервер периодически посылает удаленные сообщения на подключенные клиенты.Socket.SendAsync не обнаруживает мертвое соединение TCP
Проблема, которую я испытываю, заключается в том, что даже если клиент может быть мертв, обратные вызовы метода SendAsync указывают «SocketError.Success», а свойство Socket.Connected истинно, даже если клиент больше не " в живых". Таким образом, на сервер выглядит так, что данные heartbeat были отправлены правильно, а клиент все еще жив.
Я вижу эту проблему каждый раз, клиентский ПК либо ставится в спящий режим/спящий режим, либо, например, когда клиент работает в экземпляре VMWare, и этот экземпляр приостанавливается. Я не вижу этот вопрос, когда клиент закрывает приложение, убивает его из диспетчера задач и т.д.
internal void InternalSendAsync(ByteDataChunk chunk)
{
asyncSendArgs.SetBuffer(chunk.Buffer, 0, chunk.Offset);
asyncSendArgs.UserToken = chunk;
Socket.SendAsync(asyncSendArgs);
}
private void SendCompleted(object sender, SocketAsyncEventArgs args)
{
if (args.SocketError != SocketError.Success || !Socket.Connected)
{
InternalDisconnect(args.SocketError);
return;
}
// all is good & do some other stuff
}
Кто-нибудь имеет ни малейшего представления, что происходит здесь и почему метод SendCompleted не возвращает SocketError даже несмотря на то, клиент давно мертв (у меня был сервер, работавший несколько часов назад, и мертвый сокет никогда не обнаруживался)?
Спасибо,
Том
Право - это обычный подход. Если клиент не ответил на биение в секунд, предположите, что он мертв и отключите его. –
caf
Я согласен, что это был бы один из способов сделать это, однако я никогда не видел эту проблему с синхронными отправлениями, поскольку я всегда получал сообщение об ошибке после того, как даже если хост был поставлен в спящий режим/спящий режим – TJF