Bonjour!
Voilà, depuis un petit moment je m'efforce à créer un petit morceau de code portable pour gérer les envoies de données en TCP/IP par les sockets.

J'utilise la fonction "select" qui est souvent (dans un while) appelée afin de vérifier les descripteurs de fichiers.

Au niveau du client, lorsque je veux envoyer des données, je fais un FD_SET avec en argument la socket de communication et le descripteur de fichier "write", de manière à ce que le code suivant mon "select" soit exécuté. Ensuite, une fois que j'ai fini mon envoie de donnée je fais un FD_CLR sur la socket et le descripteur de fichier "write".

Hors, cela ne fonctionne pas comme je le désirerai...
Je m'explique :
La première fois que j'utilise mon FD_SET pour écrire, tout se passe comme il faut, les données sont envoyées. Ensuite, quand l'envoie est terminé, on arrive au FD_CLR (que je juge nécessaire pour ne pas repasser dans le code suivant le select si il n'y a rien à faire!). Cependant, lorsque je redemande une écriture de donnée en "resollicitant" FD_SET, rien ne se passe (comme si le FD_CLR précédent avait "endormi" mon descripteur de fichier).

Pour résumer : (Ce n'est pas le code linéaire tel qu'il est dans mon programme, juste des extraits!)
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
28
29
30
31
32
33
34
35
36
 
// Les déclarations
fd_set m_rfds;
fd_set m_wfds;
fd_set m_efds;
Socket m_socket;
 
// Pour initialiser
FD_ZERO(&m_rfds);
FD_ZERO(&m_wfds);
FD_ZERO(&m_efds);
 
// Une fois notre socket créée et connectée au serveur
FD_SET(static_cast<unsigned>(m_socket), &m_rfds);
FD_SET(static_cast<unsigned>(m_socket), &m_wfds);
FD_SET(static_cast<unsigned>(m_socket), &m_efds);
 
// Extrait de la fonction "Update" périodiquement appelée
fd_set rfds;
fd_set wfds;
fd_set efds;
 
FD_COPY(&m_rfds, &rfds);
FD_COPY(&m_wfds, &wfds);
FD_COPY(&m_efds, &efds);
 
int n = select((m_socket + 1), &rfds, &wfds, &efds, 0);
//(... Ici, si n > 0 on fait ce qu'il y a à faire au niveau envoie, réception ...)
 
// Ailleurs, dans une fonction d'envoi (où je n'envoie pas directement mais je 
//stock mon packet à envoyer, je demande l'écriture, et le packet sera 
//envoyé dans le code suivant le select
FD_SET(static_cast<unsigned>(m_socket), m_wfds);
 
// Lorsque l'envoie du packet est terminé
FD_CLR(static_cast<unsigned>(m_socket), m_wfds);
Auriez vous une idée pour résoudre mon problème?

En espérant avoir été suffisamment clair!
Merci beaucoup!