Как мне обрабатывать взаимодействие с пользователем и события сокетов одновременно? - PullRequest
0 голосов
/ 20 февраля 2012

Я пишу эту программу чата, которая использует ncurses в качестве интерфейса. Как я должен одновременно обрабатывать дескрипторы файлов сокетов и взаимодействие с пользователем? Моя идея ниже. Проблема в том, что цикл выполняется только один раз для каждой нажатой кнопки. Как мне структурировать мою программу так, чтобы сокеты и взаимодействие с пользователем обрабатывались сразу после их готовности? Я попытался просто включить в свой опрос дескрипторы файлов для стандартного ввода и вывода, но это не работает.

while(ch = getch()) {
   poll sockets
   loop sockets {
      ...
   }
   switch(ch) {
      ...
   }
} 

Также как более общий вопрос. Как обычно пишут программы, которые обрабатывают взаимодействие с пользователем и другие вещи, происходящие одновременно? Похоже, что был бы стандартный способ сделать это.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Вы можете попробовать nodelay() на экране ввода.

nodelay(stdscr,TRUE); // turn off getch() blocking

while(getch() == ERR)
{
    //do other stuff
}
else
    //handle input

Но есть вероятность, что вы, возможно, захотите заняться многопоточностью.

0 голосов
/ 21 февраля 2012

Создайте набор файловых дескрипторов (FD_SET), который включает STDIN, а также сокет, который вы пытаетесь прочитать, затем используйте select () на наборе. Примерно так:

int main(int argc, char **argv)
{
  fd_set fds;
  int fd = open(/* your socket */);
  struct timeval tv;

  FD_ZERO(&fds);
  FD_SET(STDIN_FILENO, &fds);
  FD_SET(fd, &fds);

  while (1) {
     tv.tv_sec = 1; // wait for up to 1 sec
     int retval = select(2, &fds, NULL, NULL, &tv);
     if (retval > 0) {
        if (FD_ISSET(STDIN_FILENO, &fds)) 
            // process stdin
        else if (FD_ISSET(fd, &fds))
            // process data from your socket
     } else if (retval == 0) 
        // timeout
     else
        // some error
   }
   exit 0;
}

(Обратите внимание, я не компилировал это, но вы должны понять.)

См. fd_set и выберите учебник

...