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