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

Поиск:

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


Опытный
**


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

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



Здрастути Люди)
Я запутался,просветите пожалуйста.

Код

   int i=0;
 while(i<=50)
{
      ...............................................................
    ...................//Обработка информации...
  ...................................................................


     //после обработки информации нужно перевести сокет из массива  в неблокирующий режим...
    //Приконектить сокет ,подвесить на постоянном соединении Keep-Alive и забыть про него.. 
    // Таких сокетов примерно 50 штук...
   //Проблема в том что присоеденяется только последний сокет 50-ый , а все остальные игнорируются
  //Пожалуйста...помогите разобраться.... спасибо заранее...
     unsigned long nb = 1;
     for(int i=0;i<=Memo1->Lines->Count-1;i++)
     {
          ioctlsocket(ssClient[i],FIONBIO,(unsigned long *) &nb);

          int    rets;
          char Send[2048];
          char szBuff[2048];
          struct sockaddr_in server;
          struct hostent    *host = NULL;

          AnsiString  Mess="GET /cgi-xml/irc HTTP/1.1\r\nAccept: */*\r\nConnection: Keep-Alive\r\n.............  ............\r\n\r\n";
       
         strcpy(Send,Mess.c_str());


          ssClient[i] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ssClient[i] == INVALID_SOCKET)
      {
          MessageBox(0, ".......error", 0);

      }

      server.sin_family = AF_INET;
      server.sin_port = htons(80);
      server.sin_addr.s_addr = inet_addr(szServerName);

       if (server.sin_addr.s_addr == INADDR_NONE)
       {
          host = gethostbyname(szServerName);
          if (host == NULL)
         {
             MessageBox(0, "................error", 0);
                         break;
         }
            CopyMemory(&server.sin_addr, host->h_addr_list[0],
            host->h_length);
         }

  
          if (connect(ssClient[i], (struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
         {
              MessageBox(0, ".........error", "error", 0);
                                                                break;
         }
         rets = send(ssClient[i],Send,strlen(Send), 0);
         if (rets == SOCKET_ERROR)
        {
           MessageBox(0, "errorrrrr", 0);
                                             break;
        }

     }//конец цикла for

   i++;
 }//Конец while




Это сообщение отредактировал(а) Comm - 2.10.2007, 04:01


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


Фигасе
****


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

Репутация: 3
Всего: 58



Comm, 
В чём сабж ?


--------------------
PM MAIL WWW   Вверх
Comm
Дата 2.10.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В том что программа должна после обработки некой инфы (HTTP запрос к серверу)  создать сокет , и подвесить его на постоянном конекте....и так после каждого захода цикла whilе ...
Но к моему большому удивлению присоеденяется сокет только один,последний(50-ый)

Я специально не писал  цикл приема данных (recv)  что бы избежать блокировки  приложения...


Думал что можно создать сокет , подготовить HTTP запрос  на постоянное соединение...присоеденить не применяю функцию recv .....и забыть про него ...

НО на практике оказалось совершенно иначе... после каждой новой попытки присоеденить новый сокет,старый закрывался(без применения функции closesocket). И так до последнего... 50-ого...

Что не так подскажите....Большое спасибо всем...







Это сообщение отредактировал(а) Comm - 2.10.2007, 15:48


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


Опытный
**


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

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



Вообще можно сделать что бы сразу 5-10 сокетов были на постоянном соединении ? smile 


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


Опытный
**


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

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



Цитата(Comm @  2.10.2007,  19:03 Найти цитируемый пост)
Вообще можно сделать что бы сразу 5-10 сокетов были на постоянном соединении ?

Можно. smile 

Цитата(Comm @  2.10.2007,  18:46 Найти цитируемый пост)
Я специально не писал  цикл приема данных (recv)  что бы избежать блокировки  приложения...

В неблокирующем режиме?!

Цитата(Comm @  2.10.2007,  18:46 Найти цитируемый пост)
.и забыть про него ...

Это как?

Цитата(Comm @  2.10.2007,  18:46 Найти цитируемый пост)
тарый закрывался

И как ты это определил?

Лично я не рекомендую использовать неблокирующий режим. С ним нужно очень осторожно работать. 
Да и стоит выкладывать весь код, а не его часть smile .

Это сообщение отредактировал(а) ptr - 4.10.2007, 15:47


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


Опытный
**


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

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



Цитата

В неблокирующем режиме?!

В блокирующем...просто в этом коде  я экспереминтировал с функцией ioctlsocket  ..и забыл закоментировать сиё чудо )) 

Цитата

Цитата(Comm @  2.10.2007,  18:46 ) 
.и забыть про него ... 
Цитата

Это как?


То есть не вызывать функцию recv после отсылки запроса....другиими словами мне не важно что придет на этот сокет,главное что бы был коннект,вот
Цитата

И как ты это определил?

Потому что соединение пропадало,логично ? =)

---------------------------------------------------------------------------------------------------------------------------
Я разобрался, дело было в том.. что запросы, действительный и предыдущий ,смешивались(кукиксы смешивались)....и поэтмоу на соединение принемался только  последний сокет ))))

Кстати, такой ещё вопросик... что бы включить асинхронный режим через объект события....надо также применять функцию  ioctlsocket ?


Это сообщение отредактировал(а) Comm - 5.10.2007, 06:23


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


 




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


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

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