【问题标题】: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_set和select tutorial