J'essaie de créer un programme de discussion de serveur client simple. Sur le côté du client, je fais tourner un autre fil pour lire toutes les données incommentaires du serveur. Le problème est que je veux résilier gracieusement ce deuxième fil lorsqu'une personne se déconnecte du fil principal. J'essayais d'utiliser une variable partagée "en cours d'exécution" pour terminer, le problème est que la commande Socket Lecture () est une commande de blocage, donc si je fais si je le fais (exécutant == 1), le serveur doit envoyer quelque chose avant que les déclarations de lecture Et la condition tandis que la condition peut être vérifiée à nouveau. Je cherche une méthode (avec des prises UNIX communes uniquement) pour faire une lecture non bloquante, fondamentalement, une forme de peek () fonctionnerait, car je peux vérifier continuellement la boucle pour voir si j'ai fini.
Le La lecture de fil de lecture est ci-dessous, il ne dispose pas de Mutex pour les variables partagées, mais je prévois d'ajouter cela plus tard Ne vous inquiétez pas! ;) p>
4 Réponses :
int x; x=fcntl(socket ,F_GETFL, 0); fcntl(socket, F_SETFL, x | O_NONBLOCK);
Vous pouvez créer une prise non bloquable, comme suggéré dans une autre post Plus, utilisez Sélectionner une entrée pour attendre l'entrée avec le délai d'attente, comme celui-ci:
fd_set input; FD_ZERO(&input); FD_SET(sd, &input); struct timeval timeout; timeout.tv_sec = sec; timeout.tv_usec = msec * 1000; int n = select(sd + 1, &input, NULL, NULL, &timeout); if (n == -1) { //something wrong } else if (n == 0) continue;//timeout if (!FD_ISSET(sd, &input)) ;//again something wrong //here we can call not blockable read
Que signifie le SD + 1 dans ce contexte? Je l'ai couru comme ça, et cela a fonctionné, mais cela bouclerait la boucle comme 20h00ish Times, puis arrêtez-vous, jusqu'à ce que de nouvelles contributions soient créées, mais elle a pris fin de manière gracieuse que je voulais, la seule préoccupation est la seule préoccupation. c'est presque comme si c'était couru pendant le délai ou quelque chose
Vous pouvez taper "Man Select" dans votre terminal pour obtenir une description détaillée de la fonction Select. Comme le premier argument Selct prend le plus grand descripteur de valeur plus 1. En raison de l'ici, nous n'avons qu'un seul descripteur, je viens d'écrire (SD + 1).
Ne comprend pas la note environ 20 fois. Mon code dans le contexte de votre première question devrait fonctionner comme ceci: 1) Vérifier le drapeau (heure à quitter?) 2) Disponible jusqu'à une entrée ou un délai d'attente 3) Lire quelque chose 4) Goto (1). Donc, il sort avec un délai. Mais vous devez gérer la situation lorsque d'autres raccordements fermés par latéralement, puis sélectionnez le contrôle de retour à vous, mais «lire» lira 0 octets et vous obtenez une boucle occupée. Donc, vous devriez vérifier le résultat de la "lecture" et de sortir de la boucle si elle zéro.
Je l'ai compris, merci, c'était que j'avais l'impression à l'intérieur de la boucle quand il n'y avait aucune contribution, c'était une question de rinçage tout résolu, merci d'avoir aidé :)
Rechercher la fonction setSockopt code> avec option
so_rcvtimeo code>. p>
La meilleure chose à faire est susceptible de se débarrasser du fil supplémentaire et d'utiliser Si vous voulez garder le fil, une chose que vous pouvez faire est d'appeler select () code> ou
sondage () code> pour tout gérer dans un thread. P>
shutdown () code> sur la prise avec
shut_rdwr code>, qui fera éteindre la connexion, réveil Tous les fils bloqués dessus mais gardent le descripteur de fichier valide. Une fois que vous avez rejoint le fil de lecteur, vous pouvez ensuite fermer la prise. Notez que cela ne fonctionne que sur les sockets, pas sur d'autres types de descripteur de fichier. P>