2009-11-06 19 views
2

J'essaye de créer un serveur qui utilise select() pour gérer plusieurs clients, contrairement au multi-threading que j'ai déjà accompli. Cependant, select() ne semble pas faire quoi que ce soit? J'ai tous les appels système nécessaires, par ex. socket() retourne à un int appelé listener. bind() puis listen(), tous avec une vérification d'erreur appropriée, qui ne renvoie aucun problème. Il compile également très bien.Problèmes Select() dans C (windows 7)

FD_ZERO(&fileDescriptors); 
FD_ZERO(&tempSet); 
..... 
FD_SET(listener, &fileDescriptors); 
fdmax = listener; 
..... 
while(1){ 
    if(select(fdmax+1, &tempSet, NULL, NULL, &timeout) == -1){ 
      //error occured 
    } 
..... 
} 

Le client ne peut pas établir une connexion, mais WSAGetLastError() Retourne 0 du côté client. Et le serveur, ne sera jamais passé select(), en dehors de renvoyer 0 en raison d'un délai d'expiration. Im vraiment du mal à voir le problème dans mon code.

Répondre

2

Vous ajoutez listener à l'ensemble fileDescriptors, mais vous passez le (vide) mis tempSet-select.

Dans votre commentaire, vous dites que vous avez réellement du code pour "set tempSet equal to fileDescriptors". En général, vous ne peut pas faire cela - vous ne savez rien sur la structure interne d'un fd_set, il peut très bien avoir des pointeurs qui doivent être copiés en profondeur. Il est dommage qu'il n'y ait pas FD_COPY - mais c'est comme ça. Vous devez construire l'ensemble à chaque fois avec FD_ZERO et FD_SET.

+0

Désolé j'ai raté le peu de code où j'ai fait tempSet égal à fileDescriptors – Rick