Comment accepter prise avec délai d'attente
Est il y a un délai compatible soulution à accepter client à l'aide de accept
fonction sans paramètre socket non bloquant?
Je sais que je devrais utiliser select
fonction de celle-ci, mais ce que je fais mal?
SOCKET NativesAcceptClient(SOCKET s, int timeout)
{
int iResult;
struct timeval tv;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(s, &rfds);
tv.tv_sec = (long)timeout;
tv.tv_usec = 0;
iResult = select(s, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
if(iResult > 0)
{
return accept(s, NULL, NULL);
}
else
{
//always here, even if i connect from another application
}
return 0;
}
Comment résoudre ce problème?
Merci!
non, le délai est de 10
Voir ma solution ci-dessous?
est-il immédiatement popping out de sélectionner ou est-ce qu'il attend 10 secondes avant de sauter (si vous ne vous connectez pas à elle)? il semble ok (à part le s+1 mentionné pour les plateformes non-Windows), autre chose est de travers...
avez-vous jamais résoudre ce problème? Si oui, pourriez-vous sélectionner une réponse ou écrivez l'un de vos propres?
Voir ma solution ci-dessous?
est-il immédiatement popping out de sélectionner ou est-ce qu'il attend 10 secondes avant de sauter (si vous ne vous connectez pas à elle)? il semble ok (à part le s+1 mentionné pour les plateformes non-Windows), autre chose est de travers...
avez-vous jamais résoudre ce problème? Si oui, pourriez-vous sélectionner une réponse ou écrivez l'un de vos propres?
OriginalL'auteur Boris | 2012-12-26
Vous devez vous connecter pour publier un commentaire.
Le premier paramètre de la
select
appel doit être égale à la le nombre le plus élevé de descripteur de fichier dans votre fd_set ensemble plus 1 (voir ici). Essayez de modifier le premier argument des+1
; vous aurez besoin d'ajouter un peu de logique quand vous avez plus d'une prise dans votre ensemble.Pouvez-vous vous assurer que votre connexion entrante est de prendre place au sein de votre 10 seconde fenêtre?
OriginalL'auteur ryanbwork
Le premier argument de select() est un int qui est d'au moins 1 plus que la valeur la plus élevée des descripteurs de fichier dans l'un des bitsets. Dans ce cas
devrait fonctionner.
OriginalL'auteur arayq2
select()
de retour >0 si un socket est signalé, 0 en cas de délai d'attente, et -1 en cas d'erreur. Quelle est la valeurselect()
fait de revenir à vous? Vous êtes la seule vérification de >0 <=0, ce qui signifie que vous ne sont pas de différenciation entre -1 et 0. Si elle retourne 0 alors pas de client se connecte à votre prise, mais si il est de retour -1, alors votre prise n'est probablement pas valide pour commencer.OriginalL'auteur Remy Lebeau