Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Problém se select [vyřešeno]  (Přečteno 1147 krát)

Dogmeat

  • Návštěvník
  • Příspěvků: 26
Problém se select [vyřešeno]
« kdy: 22 Července 2010, 13:31:31 »
Zdravím,

mám problém s následujícím zdrojákem, který má za úkol navázet spojení za pomoci neblokovacího režimu (v IPv6). Problém nastává u select, kdy je vždy vrácena hodnota větší než 0, i když daná adresa v síti vůbec není nebo na ní nic nenaslouchá na připojení.
Díky za rady.

Kód: [Vybrat]
for(ptr=result; ptr != NULL; ptr=ptr->ai_next)
      {

            sock_client = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
            if(sock_client == -1)
            {
                  chyba();
            }

            nastaveni_soc = fcntl(sock_client, F_GETFL, 0);
            if(fcntl(sock_client, F_SETFL, nastaveni_soc | O_NONBLOCK) == -1)
            {
                  chyba();
            }
      
            FD_ZERO(&sada);
            FD_SET(sock_client, &sada);
      
            timeout.tv_sec = 5;
            timeout.tv_usec = 0;
      
            i = connect(sock_client, ptr->ai_addr, (int)ptr->ai_addrlen);
      
            if(i == 0)
            {
                  if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
                  {
                        chyba();
                  }
                      continue;
            }

            if(i < 0)
            {
                  if(errno != EINPROGRESS)
                  {
                        if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
                        {
                              chyba();
                        }
                        break;
                  }
            
            }
            
            i = select(sock_client + 1, NULL, &sada, NULL, &timeout);
            if(i < 0)
            {
                  if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
                  {
                        chyba();
                  }
                  continue;
            }

            if(i == 0)
            {
                  cout <<  "Trying again";
            }
            if(i > 0)
            {
                  cout << ....
            }

            if(fcntl(sock_client, F_SETFL, nastaveni_soc) == -1)
            {
                  chyba();
            }

            break;
      }
« Poslední změna: 22 Července 2010, 22:11:07 od kiklhorn »

Dogmeat

  • Návštěvník
  • Příspěvků: 26
Re: Problém se select
« Odpověď #1 kdy: 22 Července 2010, 22:10:39 »
Problém už jsem vyřešil, bylo potřeba po select ověřit socket na chybu pomocí getsockopt(), nyní již vše funguje.

 

Provoz zaštiťuje spolek OpenAlt.