Fonction select() sous windows et unix

Signaler
Messages postés
3
Date d'inscription
samedi 30 août 2003
Statut
Membre
Dernière intervention
9 septembre 2003
-
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004
-
je dois porter un logiciel de windows et unix, je dois utiliser la fonction select() (déclarée dans winsock2.h sous windows et sys/select.h sous unix) mais je ne suis pas sur de pouvoir la remplacer telle quelle car les bits fd_set me semble pas compatibles .... mais ma maigre connaissance du domaine ne m'aide pas, alors j'aimerais si possible une petite explication claire sur le sujet.

Merci

6 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
La macro FD_SET n'est pas definie dans le select.h d'unix ?
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Les macros sont parfaitement utilisables sous Windows et Unix, et pour peu qu'on respecte les normes, on peut avoir du code fonctionnel sur les deux systèmes...

Je code un démon de dialogue en direct, et avec des #ifdef pour isoler les parties spécifiques Unix (fork, setsid, etc) et Windows (WSAStartup, etc) tout fonctionne !

Un extrait (gestion des pings du démon) :
  int i;
  fd_set sockets;
  struct timeval waiting = {30,0};
  FD_ZERO(&sockets);
  FD_SET(client->socket, &sockets);
  i = select(FD_SETSIZE, &sockets, NULL, NULL, &waiting);
/*
i<0 signifie que le socket est fermé
i=0 signifie que le temps est écoule
i>0 signifie que des données sont prêtes à être lues
*/


Ici, le démon est multithreadé (un thread par client) et donc n'écoute qu'un seul socket, mais on peut très bien écouter plusieurs sockets à la fois (pas plus de 64 par select, pour Windows)...

En espérant que çà t'aidera...

A+
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Salut,

si si tu peux depasser la limite des 64 en mettant un define juste avant d'inclure winsock2 :

#define FD_SETSIZE 500
#include <WinSock2.h>

Voila maintenant ta nouvelle limite est 500.

Et ca marche, j'ai actuelement sur mon serveur 350 personnes
de connectees, et en 2 threads, un pour le select, l'autre pour l'interface.

Rno
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Merci pour cette précision intéressante :)

Je sais plus où j'avais vu cette histoire de 64 sockets, mais c'était peut-être pour Windows 9x... Tu es sous NT (ou un de ses descendants) ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
La vrai limite de 64sockets c'est WSAWaitForMultipleEvent qui la fixe. Apres avec select() (et sous windows car je connais pas le reste), on peut depasser la limite de 64 avec la technique de Manson.
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Salut,

mon serveur tourne sous 2000, j'ai fait le test chez moi et il tourne aussi sous XP.

Rno