我正在编写这个使用ncurses作为界面的聊天程序。我怎么想同时处理套接字文件描述符和用户交互?我的想法如下。问题是现在循环只对我按下的每个按钮执行一次。如何构建我的程序,以便在它们准备好后立即处理套接字和用户交互?我试过让我的民意调查包括标准输入和输出的文件描述符,但这不起作用。
while(ch = getch()) {
poll sockets
loop sockets {
...
}
switch(ch) {
...
}
}
也是一个更普遍的问题。人们通常如何编写处理用户交互和其他事情的程序?似乎有一种标准的方法可以做到这一点。
答案 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;
}
(注意我没有编译这个,但你应该明白这个想法。)