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!)
Auriez vous une idée pour résoudre mon problème?
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);
En espérant avoir été suffisamment clair!
Merci beaucoup!
Partager