à 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.

vous savez que la première chose à faire est de quitter le programme, lorsque quelque chose dans vai le socket?
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