C - les Sockets Unix - Non-bloquant lire
Je suis en train de faire un simple client-serveur programme de chat. Sur le côté client je spin-off d'un autre thread pour lire toutes les données entrantes à partir du serveur. Le problème est, je veux gracieusement mettre fin à cette deuxième thread quand une personne se connecte à partir du thread principal. J'ai essayé d'utiliser une variable partagée 'running' pour mettre fin à, problème est, le support de lecture() la commande est un blocage de la commande, donc si je fais tout(running == 1), le serveur doit renvoyer quelque chose avant de lire la retourne et la condition du while peut encore être vérifiée. Je suis à la recherche d'une méthode (avec les communes, les sockets unix seulement) pour en faire un non-blocage de lire, fondamentalement, une certaine forme de peek (), je peux vérifier en permanence la boucle pour voir si je suis fait.
Le thread de lecture en boucle est ci-dessous, pour l'instant il n'a pas de mutex pour les variables partagées, mais j'ai l'intention d'ajouter que, plus tard, ne vous inquiétez pas! 😉
void *serverlisten(void *vargp)
{
while(running == 1)
{
read(socket, readbuffer, sizeof(readbuffer));
printf("CLIENT RECIEVED: %s\n", readbuffer);
}
pthread_exit(NULL);
}
OriginalL'auteur will | 2011-11-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire socket non filtrables, comme suggéré dans un autre post, plus l'utilisation de sélectionner attendre d'entrée avec délai d'attente, comme ceci:
Vous pouvez taper "man sélectionnez" dans votre terminal pour obtenir une description détaillée de la fonction de sélection. Comme premier argument de sélection de prendre la plus grande en valeur de descripteur de plus de 1. Car ici nous n'avons qu'un seul descripteur, je viens d'écrire (sd + 1).
Comprends pas la note d'environ 20 fois. Mon code dans le cadre de votre première question, qui fonctionne comme suit: 1)vérifier l'indicateur(l'heure de sortie?) 2)le sommeil jusqu'à l'entrée ou le délai d'attente 3)lire quelque chose 4)goto (1). Donc sortie avec un peu de retard. Mais vous devez gérer la situation lorsque l'autre côté fermeture de la connexion, puis sélectionnez contrôle de retour pour vous, mais "lire" va lire 0 octets, et vous êtes occupé de la boucle. Donc, vous devriez vérifier le résultat de "lire" et sort de la boucle si c'zéro.
J'ai tout compris, merci, c'est que j'ai l'impression de l'intérieur de la boucle quand il n'y a pas d'entrée, c'était un rinçage problème résolu, merci pour les aider 🙂
OriginalL'auteur fghj
ou, si vous avez d'autres indicateurs:
puis vérifier la valeur de retour de la lire pour voir si il y avait des données disponibles.
remarque: un peu de googling donnera beaucoup de plein exemples.
Vous pouvez également utiliser des sockets blocage, et "coup d'oeil" avec
select
avec un délai d'attente. Il semble plus approprié ici si vous ne le faites pas occupés à attendre.OriginalL'auteur Karoly Horvath
La meilleure chose est susceptible de se débarasser du fil supplémentaire et l'utilisation
select()
oupoll()
de tout traiter dans un seul thread.Si vous voulez garder le fil, une chose que vous pouvez faire est d'appeler
shutdown()
sur le support, avecSHUT_RDWR
, qui va fermer la connexion, service de réveil, tous les threads bloqués sur elle, mais garder le descripteur de fichier valide. Après avoir rejoint le thread de lecture, vous pouvez ensuite fermer le socket. Notez que cela ne fonctionne que sur les sockets, pas sur d'autres types de descripteur de fichier.OriginalL'auteur jilles
Look pour la fonction
setsockopt
avec l'optionSO_RCVTIMEO
.OriginalL'auteur Andrii
Cela peut ne pas être la réponse que vous cherchez, mais il est peut-être l'endroit où vous pourriez trouver. Je suis en train de lire:
Unix, Programmation Réseau, Volume 1: Les Sockets Réseau API, 3e Édition
Et il y a beaucoup d'exemples de multi-thread, non-blocage des serveurs et des clients. Aussi, ils expliquent beaucoup de raisonnement et de recherche de compromis entre les différentes méthodes.
Espère que ça aide...
Vous êtes les bienvenus pour ajouter de la non-annonce lien que vous souhaitez. Je n'ai aucune affiliation avec Amazon ou Addison-Wesley. Cependant, les liens vers Amazon rend accessible à l'achat, a aperçus et des examens et est généralement une URL stable qui n'expirera pas dans un avenir proche.
Je ne veut pas dire qu'Amazon, je voulais dire, que le lien se fait par le biais d'un énigmatique rads.stackoverflow.com. Mais, cela dit, j'ai déjà constaté que dans votre post n'est pas ce lien, c'est donc ce qui semble être une farces de la StackOverflow lui-même. Btw, juste curieux -- voyez-vous un tel lien dans le post(j'ai juste pensé que le lien pourrait être caché de l'auteur)?
OriginalL'auteur Homer6