Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два вопроса .. 
:(
    Опции темы
Comm
Дата 10.10.2007, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



1-ый
 Допустим есть соединение между клиентом и сервером (соединение keep-alive)
 Клиент ждет от сервера данных ф-ией recv, и если их нет..так и продолжает висеть в  ожидании..
 Пытался поставить на сокет тайм аут в 5 сек ф-ией select, не помогло..не выходит из ф-ии recv
 Вообще можно выйти из recv не разрывая соединения (keep-alive) для опроса следующего keep-alive соединения ?

2-ой
  ПОможет ли  в этой ситуации ф-ия  ictolsocket  ?


Большое Всем Спасибо..


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
dumb
Дата 10.10.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 1
Всего: 158



переводи сокет в неблокирующий режим посредством той самой ictolsocket + FIONBIO.
PM MAIL   Вверх
Comm
Дата 10.10.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Что первым сделать надо, поставить тайм аут на сокет,или перевести его не в блокирующий режим ? 


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 10.10.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Код


void T::ConnectAnalyzer()
{

         fd_set fds;
         FD_ZERO(&fds); // обнуляем набор сокетов
         timeval RecvTimeQuit;
         RecvTimeQuit.tv_sec=3; 
         RecvTimeQuit.tv_usec=0;
         count=0;
         Error=false;
         int soul=0;
         SOCKET client,sssClient[10];

        while(count <10)
        {
                   ...................
                  ....................// сбор информации
               .......................// soul ++ ;



                 closesocket(Client);
                 if(Error)
                     break;
                     else
                       if(IrqConnector(true,soul,sssClient[soul])) //Если  Error false то конектим сокет
                       {
                         FD_SET(sssClient[soul],&fds); //  если приконектили то добавляем сокет в набор
                         unsigned long sd=1;
                         ioctlsocket(sssClient[i],FIONBIO,(unsigned long*)&sd); // переводим в асинхронный режим 
                    
                        }   

         }// конец while

     select(0,&fds,NULL,NULL,&RecvTimeQuit); // устанавливаем тайм аут на набор сокетов 
    while(!Error)
    {
                 // В общем тут сокет должен не дожидаться прихода данных..
                //и  через таймаут должен выходить из ф-ии recv для опроса следующих по списку  соединений....
               //но так почему то не происходит.... Что я не правильно делаю ? 
                 for(int i=0;i<soul;i++)
                {
                    if(FD_ISSET(sssClient[i],&fds))
                   {

                       ret=recv(sssClient[i],smSend,sizeof(smSend),0);
                       if (ret == SOCKET_ERROR)
                       {
                            ret=WSAGetLastError();
                            if(ret)
                            {
   
                               FD_CLR(sssClient[i],&fds);
                               closesocket(sssClient[i]);
                               Error=true;
                               break;
                            }
                           else
                           {
                              GLAV->Memo3->Lines->Add(IntToStr(ret));
                              Error=true;
                              break;
                            }

                        }else
                        if (ret == 0)
                       {
                          closesocket(sssClient[i]);
                          if(!ConnectAndSendRecv1(i))
                          {
                             FD_CLR(sssClient[i],&fds);
                             closesocket(sssClient[i]);
                          }

                       }
                  }// конец  fd_isset

           }// конец for
           GLAV->Memo3->Lines->Add("Опрос сокетов  ОК...");
       if(Error)
          break;
  
   } // конец while
   for(int i=0;i<soul;i++)
  {
   closesocket(sssClient[i]);
  }

} // конец функции


Спасибо заранее......

Это сообщение отредактировал(а) Comm - 10.10.2007, 19:31


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
mrbrooks
Дата 11.10.2007, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Я решал аналогичную проблему совсем недавно с помощью WSAEnumNetworkEvents - с ее помощью как раз и происходит ожидание. Код рабочий на все 100%. Просто я тогда не правильно порт указал  smile Посмотри его - у меня сервак отдает инфу как родненький. Идея то таже самая  smile 
PM MAIL   Вверх
Comm
Дата 11.10.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



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

Это сообщение отредактировал(а) Comm - 11.10.2007, 17:39


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
ptr
Дата 12.10.2007, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Comm @  11.10.2007,  20:32 Найти цитируемый пост)
мне не понятно почему то что я написал не работает так  как задумывалось...не зря же я писал .... 

Потому что неправильно работаешь с select. Здесь есть пример работы с select (правда он для *nix).

P.S. на будущее выкладывай более полный код.В кусочном сложнее искать ошибку.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Comm
Дата 13.10.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Отличный пример))) посмотрел,понял,сделал))) все работает отлично...
Спасибо ptr


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.