如何同时处理用户交互和套接字事件?

时间:2012-02-20 18:10:57

标签: c++ sockets ncurses event-driven

我正在编写这个使用ncurses作为界面的聊天程序。我怎么想同时处理套接字文件描述符和用户交互?我的想法如下。问题是现在循环只对我按下的每个按钮执行一次。如何构建我的程序,以便在它们准备好后立即处理套接字和用户交互?我试过让我的民意调查包括标准输入和输出的文件描述符,但这不起作用。

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

也是一个更普遍的问题。人们通常如何编写处理用户交互和其他事情的程序?似乎有一种标准的方法可以做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以在输入屏幕上尝试nodelay()

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

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

但是你可能想要去线上了。

答案 1 :(得分:0)

构建一个文件描述符集(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_setselect tutorial