L'utilisation de select() pour le délai d'expiration
J'ai seulement été en mesure de définir un maximum de 20 secondes que le paramètre de délai d'attente dans le select () de l'API. Quelle que soit la valeur que j'ai donné au-dessus de 20, select() est de retour après 20 secondes...
Donc j'essayais d'écrire une boucle pour le délai d'attente de 1 minute comme ce
int timeoutcount = 0;
do
{
FD_ZERO(&fd);
FD_SET(sock,&fd);
timeout.tv_sec = 20;
timeout.tv_usec = 0;
rc = select (sock+1,&fd,null,null,&timeout);
if(rc ==0)
timeoutcount += 20;
}
while(rc ==0 && timeoutcount <60)
merci de m'aider...je vais dans le bon sens?
Si oui,sélectionnez retourne 1 après le premier délai d'attente..m'aider à comprendre ce trop
Note: je l'utilise en objective-C
Comment savoir si vous êtes timing, et de ne pas arriver les événements sur
Quand j'ai essayé pour la première fois, j'ai mis le timeout de 60 secondes. J'ai eu les événements sur la "chaussette" après 20 secondes lui-même, bien que mon câble réseau est débranché. Après cela, lorsque j'ai donné le délai d'attente de 20 secondes, il a été fonctionne correctement..
eh bien, vous avez besoin pour gérer la prise de l'événement. peu importe si votre câble est débranché ou pas. Vous pourriez obtenir un événement parce que le fait qu'il est débranché, ou quelque chose de synchronisation au niveau de la socket, en fonction de ce que vous faites. sélectionnez retourne quand: SOIT un socket a un événement, OU le délai d'attente se produit. sélectionnez() fonctionne exactement comme annoncé. Si vous ne manipulez pas la prise de l'événement, vous venez juste d'obtenir le même événement, la prochaine fois que vous appelez sélectionnez sur ce socket.
Je l'accepte. Mais puis-je savoir pourquoi select() retourne un événement à 22 secondes si mon délai d'attente est de 60 secondes (P. S Mon câble réseau est débranché lorsque je testais ce cas).
en raison d'un événement sur le socket qui s'est passé à cette époque. Vous avez besoin pour gérer cet événement, qui est: read() de la prise pour savoir POURQUOI il y avait un événement. Les événements sur le socket et le paramètre de délai d'attente pour sélectionner n'a aucun rapport, sauf que le délai se déclenche si aucun des sockets avez un événement à l'intérieur de ce temps.
sock
?Quand j'ai essayé pour la première fois, j'ai mis le timeout de 60 secondes. J'ai eu les événements sur la "chaussette" après 20 secondes lui-même, bien que mon câble réseau est débranché. Après cela, lorsque j'ai donné le délai d'attente de 20 secondes, il a été fonctionne correctement..
eh bien, vous avez besoin pour gérer la prise de l'événement. peu importe si votre câble est débranché ou pas. Vous pourriez obtenir un événement parce que le fait qu'il est débranché, ou quelque chose de synchronisation au niveau de la socket, en fonction de ce que vous faites. sélectionnez retourne quand: SOIT un socket a un événement, OU le délai d'attente se produit. sélectionnez() fonctionne exactement comme annoncé. Si vous ne manipulez pas la prise de l'événement, vous venez juste d'obtenir le même événement, la prochaine fois que vous appelez sélectionnez sur ce socket.
Je l'accepte. Mais puis-je savoir pourquoi select() retourne un événement à 22 secondes si mon délai d'attente est de 60 secondes (P. S Mon câble réseau est débranché lorsque je testais ce cas).
en raison d'un événement sur le socket qui s'est passé à cette époque. Vous avez besoin pour gérer cet événement, qui est: read() de la prise pour savoir POURQUOI il y avait un événement. Les événements sur le socket et le paramètre de délai d'attente pour sélectionner n'a aucun rapport, sauf que le délai se déclenche si aucun des sockets avez un événement à l'intérieur de ce temps.
OriginalL'auteur Kesav | 2012-03-21
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas de 20 secondes maximum pour le délai d'attente pour sélectionner -- quelque chose d'autre (le plus probable de données prêts à l'emploi pour les lire sur votre prise de courant) doit être à l'origine de select() pour revenir au début. Si vraiment vous voulez seulement utiliser select() comme un moyen de sommeil, essayez de l'appeler comme ceci:
sélectionnez() sera de retour dès qu'un événement se produit sur un régime enregistré d'socket, ou si aucune prise événements se produisent, alors il sera de retour après l'heure indiquée par votre valeur de délai d'attente est écoulé. Donc, si vous voulez gérer les socket événements ainsi que d'obtenir un délai, vous devez gérer la prise des événements comme ils se produisent, et alors appel à select() à nouveau par la suite (avec pour conséquence d'une réduction de valeur de délai d'expiration).
J'ai une base de doute. Va Select() revenir à l'événement, même si il n'y a pas de connexion réseau?
Bien sûr, il peut le faire; en particulier un socket TCP, pourrait éventuellement du temps à essayer d'envoyer, puis sélectionnez() serait de retour avec le socket marqué comme prêt-à-lire, puis de les lire()/recv() renvoie un message d'erreur pour indiquer que la connexion TCP a été brisé. Je ne suis pas sûr si un socket UDP ferait la même chose, mais elle le pourrait.
OriginalL'auteur Jeremy Friesner