Bonjour !

Voici une enigme :o

Dans la boucle de mon programme, j'ai un select(), suivi de l'acceptation des clients, suivi de la boucle qui verifie si il y a quelque chose à lire sur les clients !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    while(!shutdown)
    {
        cout << "boucle select"<<endl;
        if(!Master->Select(NULL))
        {
            continue;
        }
        if(FD_ISSET(Master->Socket(), &Master->GetSocketSet()))
        {
            TCPsocket is = Master->Accept();
            if(is != SOCKET_ERROR)
            {
                string ip = Master->GetAcceptedIp();
 
                cout << "Accepted connection from: " << ip << endl;
 
                Master->AddClient(is, ip);
            }
        }
        for(auto itr = Master->Clients().begin(); itr != Master->Clients().end(); ++itr)
        {
if(FD_ISSET(itr->second.GetSocket(), &Master->GetSocketSet()))
{
            cout << "Boucle des clients"<<endl;
}
        }
}
Voici la fonction Select:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        inline int Select(const long us) {
            if(us > 0)
            {
                struct timeval tv;
                tv.tv_sec = 0;
                tv.tv_usec = us;
 
                return select(_maxfd, &recvfs, NULL, NULL, &tv);
            }
            else
            {
                return select(_maxfd, &recvfs, NULL, NULL, NULL);
            }
        }
La fonction AddClient(), ajoute le socket au descripteur.

Quand je demarre mon programme, j'ai:
Boucle select
Quand je connecte un client (des qu'il se connecte , il envoie un message)
J'ai:
Accepted [...]
Problemes:
  • J'aimerais pouvoir faire en sorte que select() ne bloque pas la suite de la boucle, car je dois pouvoir lire les données tout le temps !
  • Quand un client se connecte, la connexion est bonne, mais je ne recois pas le message (en clair, FD_ISSET n'est pas true, alors qu'il devrait l'etre (puisque j'envoie un message tout de suite apres la connexion !))


Quelqu'un a une idée? :o
merci, nico.