Всем привет.
пытаюсь сделать аналог kbhit. надо в целях тестирования программы.
ну естественно подсмотрел на форумах варианты.
например
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
printf("!!! wait KBHIT !!!\n"); //вывожу для отладки
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
printf("!!! ch = %d !!!\n", ch);//вывожу для отладки
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
printf("!!! KBHIT Catch !!!\n"); //вывожу для отладки
return 1;
}
return 0;
}
всё бы ничего.
и работает как бы...
В дочернем потоке вертится прослушка сокета. клиент подключается шлёт что=то, сервер это что-то обрабатывает.
если в процессе нажать на клавишу, то kbhit срабатывает.
но если клиент отключился от сервера и при этом закрыть прослушиваемый сокет, то kbhit работать перестает!
т.е. не принимает ввод с клавиатуры.
как побороть даже не догадываюсь...
int main(int argc, char *argv[])
{
BaseModuleManager bmm(1024, "/usr/bin/bm-database");
bmm.loadConfigurationFromDB();
bmm.startServer(); //тут запускается поток с ожиданием подключения клиентаи дальнейшим обменом
sleep(1);
while (!kbhit())
{
sleep(1);
}
bmm.stopServer();
return 0;
}
сокет при отключении клиента закрывается так
close(sd);
shutdown(sd, SHUT_RDWR);
sd=0;
после этого клиент, если ему надо, нормально переподключается к серверу, данные от него приходят,НО!!!! КЛАВИАТУРА на ввод НЕ РЕАГИРУЕТ!!!
printf("!!! ch = %d !!!\n", ch); всё время печатает "-1"
как говорится, хелп ми, сос ми
я в трансе
OS Debian, TCP, неблокирующие сокеты.
заранее спасибо.
UPD
вставил perror в цикле kbhit
так вот после закрытия сокета начинает выводить: bad file descriptor
Это чо за на....