Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > как определить что select вернул сокеты с дисконне


Автор: hash_2000 10.11.2010, 14:50
Всем здравствуйте !
такая вот проблемка .. есть сервер который принимает клиентские подключения и записывает их все в общую 
fd_set ну и слушает когда поступит подключение или прием данных через, соответственно, select .. 
так вот .. если ктото из клиентов сделал у себя closesocket то функция select так же как и приеме данных вернет буфер с откликнувшимися сокетами
... может кто знает ... вот как определить именно в том месте где select вернула управление что сокет не данные прислал а именно отключился,
без использования recv .. дело в том что чтение данных уже проводится в потоках, а хотелось бы определить отключенный сокет еще до того как он 
отправился на обработку в поток ... есть ли вообще такая возможность?
например так:

Код


fd_set g__arr;
 
 
void Init ()
{
 
    SOCKET sock = // ... создаем сокет в режиме listen на какойто порт
    FD_SET( sock, &g__arr );
 
}
 
void Wait ()
{
 
   while( 1 )
   {
 
      fd_set pWait;
      memcpy( &pWait, &g__arr, sizeof(fd_set) );
 
   // вот тут ждем вечно
      int ret = select( &pWait, 0,0,0 );
   // как только чтото пришло
   // вот тут например и обрабатываем все что нам пришло на порты которые слушаются
 
      for( int i = 0 ; i < pWait.fd_count ; i ++ )
      {
 
   // если это попытка соедениться то делаем :
           SOCKET cl = accept( m_buf.fd_array[i], ... );
           FD_SET( cl, &g__arr );
   // если это был клиентский сокет на который должны были прийти какието данные ...
   // то читаем данные и обрабатывает
   // но если ктото из клиентских сокетов сделал closesocket то select вернет в pWait массив сокеты
   // которые сделали closesocket и ret будет равен количеству элементов в pWait  ....
   //   и вот как тут вот узнать что клиент именно разорвал соединение а не передает данные ????
 
      }
 
   }
}
 
void main ()
{
     Init();
     Wait();
 
}



Автор: hash_2000 11.11.2010, 13:46
вот решение ... если кому интересно 
http://forum.sources.ru/index.php?showtopic=318020

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