【问题标题】:How do I handle user interaction and sockets events simultaneously?如何同时处理用户交互和套接字事件?
【发布时间】:2012-02-20 18:10:56
【问题描述】:

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

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

也是一个更一般的问题。通常如何编写程序来同时处理用户交互和其他事情?似乎会有一种标准的方法来做到这一点。

【问题讨论】:

    标签: c++ sockets ncurses event-driven


    【解决方案1】:

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

    nodelay(stdscr,TRUE); // turn off getch() blocking
    
    while(getch() == ERR)
    {
        //do other stuff
    }
    else
        //handle input
    

    但你可能想继续往下走。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 2017-06-04
        • 1970-01-01
        • 2018-11-07
        相关资源
        最近更新 更多