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


Автор: Comm 2.10.2007, 03:55
Здрастути Люди)
Я запутался,просветите пожалуйста.

Код

   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



Автор: GrayCardinal 2.10.2007, 11:22
Comm, 
В чём сабж ?

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

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


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

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

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






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

Автор: ptr 4.10.2007, 15:41
Цитата(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 .

Автор: Comm 5.10.2007, 04:41
Цитата

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

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

Цитата

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

Это как?


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

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

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

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

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

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