Я пишу чат-программу на основе ncurses.Сначала я писал только сетевые материалы (без ncurses), и все работало нормально, но после добавления графики я не могу заставить клиентское приложение работать должным образом.
Основная проблема - чтение из stdin и socket вв то же время.В версии без ncurses я использовал pthread, и он работал как шарм.Увы, кажется, что pthread и ncurses не очень хорошо сочетаются друг с другом, поэтому мне пришлось искать другое решение.Я думал, что будет делать select (), но он все еще только читает из stdin и полностью игнорирует сокет.
Вот весь код: code
Интересная частьis:
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);
}
}
}
Возможно, я не до конца понимаю, как работает select (), или, возможно, мне не нужно было подключать connect () к сокету ... Я здесь потерян.Буду признателен за любую помощь!Спасибо.