Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Как проверить состояние сокета?


Автор: -Mikle- 5.6.2005, 14:09
кратко опишу проблему.

Есть код на сервере, который в отдельном потоке циклично проверяет, пришли ли данные:


Код

        void ThreadRecive()
        {
            // RSck - это переменная класса типа Socket, полученная при вызове
            // метода TcpListener.AcceptSocket()

            int AvData;
            Console.WriteLine("enter to ThreadRecive");
            while( doThread )
            {
                AvData = RSck.Available;
                if ( AvData > 0 )
                {
                    // вызов события класса
                    OnRecive(this, RSck, AvData);
                    if ( c_OneRecive ) doThread=false;
                }
                Thread.Sleep(1);
            }
            Console.WriteLine("exit from ThreadRecive");
        }



Проблема в следующем: если во время выполнения цикла клиент отрубится, т.е. сокет станет не доступен для передачи или приема, то цикл так и будет выполнятся, не зная о том, что удаленный комп уже недоступен.
Мне нужно как-то отловить факт того, что клиент стал недоступен(например у него инет пропал), еще до того как я че-нить ему пошлю. Отлавливать ексепшн, при посылке данных клиенту, не годиться, так как эти данные сервер может и не послать никогда. Короче мне в этом цикле нужно поймать момент, когда клиент отрубился.

PS: MSDN смотрел...

Автор: -Mikle- 5.6.2005, 16:37
ИЗВИНЯЮСЬ ЗА ТО ЧТО ПОТОРОПИЛСЯ С ВОПРОСОМ.

Вопрос снят, определить отвалился ли клиент можно так:

if ( RSck.Poll(0, SelectMode.SelectRead) && RSck.Available == 0)
{
// соединение было закрыто
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)