à l'aide de select à lire à partir de socket et de stdin.
Je suis en train d'écrire un basé sur ncurses programme de chat. Au début, j'ai écrit juste au réseau (sans ncurses) et tout a bien fonctionné, mais après l'ajout de graphiques je ne peux pas obtenir l'application cliente pour fonctionner correctement.
Le principal problème est la lecture de l'entrée standard stdin et prise en même temps. En ncurses-moins la version que j'ai utilisé pthread et cela a fonctionné comme un charme. Hélas, il semble que pthread et ncurses ne vont pas très bien ensemble, j'ai donc dû trouver une autre solution.
Je pensais que select (), mais encore, elle ne lit depuis l'entrée standard stdin et ignore complètement la douille.
Voici le code entier: code
La partie intéressante est:
char message[1024];
fd_set master;
fd_set read_fds;
FD_ZERO(&master);
FD_ZERO(&read_fds);
FD_SET(0,&master);
FD_SET(s,&master); //s is a socket descriptor
while(true){
read_fds = master;
if (select(2,&read_fds,NULL,NULL,NULL) == -1){
perror("select:");
exit(1);
}
//if there are any data ready to read from the socket
if (FD_ISSET(s, &read_fds)){
n = read(s,buf,max);
buf[n]=0;
if(n<0)
{
printf("Blad odczytu z gniazdka");
exit(1);
}
mvwprintw(output_window,1,1,"%s\n",buf);
}
//if there is something in stdin
if (FD_ISSET(0, &read_fds)){
getstr(message);
move(CURS_Y++,CURS_X);
if (CURS_Y == LINES-2){
CURS_Y = 1;
}
n = write(s,message,strlen(message));
if (n < 0){
perror("writeThread:");
exit(1);
}
}
}
Il est possible que je n'ai pas de comprendre pleinement comment sélectionner() fonctionne, ou peut-être que je ne devrais pas avoir connect()ed le socket.. je suis perdu ici. J'apprécierais toute aide! Merci.
aussi, ne pas utiliser FD_ZERO( 0, utiliser FD_SET( fileno( stdin ), ...
désolé, la sortie était là seulement pour voir si le programme ne sera jamais arriver à ce point. merci pour cette remarque cependant 😛
Je pense que vous avez tort de penser ncurses et les threads sont incompatibles. Si vous rencontrez des problèmes, vous êtes en train de faire quelque chose de mal (comme d'essayer de manipuler les malédictions des structures de données à partir de plusieurs threads simultanément).
OriginalL'auteur michauwilliam | 2011-04-28
Vous devez vous connecter pour publier un commentaire.
Votre problème est dans le
select()
.Le premier paramètre est pas le nombre de descripteurs de fichiers vous êtes de passage dans read_fds, mais c'est la plus grande prise ID + 1.
À partir de la page de man:
Donc, dans votre code, au lieu de '2', essayer de passer '+1'.
j'ai oublié wrefresh après l'impression. problème résolu, merci
OriginalL'auteur fabrizi0
Vous devez spécifier les plus descripteur de fichier pour sélectionner:
sélectionnez() a besoin de connaître le nombre de descripteurs de fichiers que est censé le montre.
Non, le numéro n'est pas le nombre de descripteurs de fichiers, il est l'un de plus que le plus haut descripteur de fichier. et "s + 1" est certainement plus grand que 2.
OriginalL'auteur Richard Pennington