DoingWork Ответов: 2

Как обнаружить закрытое TCP-соединение, когда клиент бесславно отключился ?


How to detect closed TCP connection when Client disconnected disgracfully i.e sudden power off ?


Следующий метод не работает, когда клиент бесславно отключается.

Что я уже пробовал:

<pre>if (socket != null)
                    {
                        bool part1 = socket.Poll(1000, SelectMode.SelectRead);
                        bool part2 = (socket.Available == 0);
                        if (part1 && part2)
                        {
                            return false;
                        }
                        else
                        {
                            return true;
                        }
                    }
                    else
                        return false;

2 Ответов

Рейтинг:
2

0x01AA

TCP keepalive
Это выглядит многообещающе, ответ 3 в .net - мгновенное обнаружение отключения клиента от сокета сервера - переполнение стека[^]

а также здесь: http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html[^]

Надеюсь, это поможет.


DoingWork

Режим Keep Alive решает проблему на 50%. Но если у вас нет возможности сделать клиента живым, то какой же будет вариант?

Рейтинг:
1

RickZeeland

Я использовал что-то вроде этого:

bool connectedLocal = true;

using (var socketTemp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
 {
     socketTemp.Connect(ip, port);

     // Loop until prg finished or connection is lost.
     while (Running && connectedLocal)
     {
         Thread.CurrentThread.Join(100);
         connectedLocal = !(socketTemp.Poll(0, SelectMode.SelectRead) && socketTemp.Available == 0);
     }

     socketTemp.Close();
}


DoingWork

Он терпит неудачу, когда подключенный клиент бесславно отключается, то есть не может отправить разъединение в сеть из-за отключения питания.

RickZeeland

Вот странно, в нашей сети это работает как положено, может быть, это как-то связано с вашей сетевой конфигурацией ?