Fonction select() sous windows et unix

cs_peyou Messages postés 3 Date d'inscription samedi 30 août 2003 Statut Membre Dernière intervention 9 septembre 2003 - 9 sept. 2003 à 12:43
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004 - 10 sept. 2003 à 12:39
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
A voir également:

6 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 sept. 2003 à 13:04
Salut,
La macro FD_SET n'est pas definie dans le select.h d'unix ?
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
9 sept. 2003 à 13:45
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+
0
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004
9 sept. 2003 à 15:57
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
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
9 sept. 2003 à 16:28
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) ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 sept. 2003 à 18:23
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.
0
cs_Manson Messages postés 137 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 30 septembre 2004
10 sept. 2003 à 12:39
Salut,

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

Rno
0
Rejoignez-nous