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 !
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
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; } } }
La fonction AddClient(), ajoute le socket au descripteur.
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); } }
Quand je demarre mon programme, j'ai:
Quand je connecte un client (des qu'il se connecte , il envoie un message)Boucle select
J'ai:
Problemes:Accepted [...]
- 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.
Partager