Descripteur de fichier incohérent !
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:
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:
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:
Quand je connecte un client (des qu'il se connecte , il envoie un message)
J'ai:
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.