У меня проблема с методом Socket.SendAsync, не обнаружившим оборванное TCP-соединение.В моем клиент-серверном приложении сервер регулярно отправляет тактовые импульсы подключенным клиентам.
Проблема, с которой я сталкиваюсь, заключается в том, что даже если клиент может быть мертвым, обратные вызовы из метода SendAsync указывают «SocketError.Success», а свойство Socket.Connected имеет значение true, хотя клиент недольше "живой".Таким образом, на сервер похоже, что данные пульса были отправлены правильно, а клиент все еще жив.
Я вижу эту проблему каждый раз, когда клиентский ПК переводится в спящий режим / режим гибернации или, например, когда клиент работает в экземпляре 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хотя клиент давно мертв (у меня сервер работал несколько часов назад, а мертвый сокет никогда не обнаруживался)?
Спасибо,
Том