如何同时处理用户交互和套接字事件
How do I handle user interaction and sockets events simultaneously?
我正在编写一个使用ncurses作为接口的聊天程序。我应该如何同时处理套接字文件描述符和用户交互?我的想法如下。现在的问题是,对于我按下的每个按钮,循环只执行一次。如何构建我的程序,使套接字和用户交互在准备好后立即得到处理?我试着让我的民意调查包括标准输入和输出的文件描述符,但这不起作用。
while(ch = getch()) {
poll sockets
loop sockets {
...
}
switch(ch) {
...
}
}
也是一个更普遍的问题。一个人通常是如何编写程序来同时处理用户交互和其他事情的?似乎有一种标准的方法可以做到这一点。
您可以在输入屏幕上尝试nodelay()
。
nodelay(stdscr,TRUE); // turn off getch() blocking
while(getch() == ERR)
{
//do other stuff
}
else
//handle input
但很可能你会想继续走下去。
建立一个文件描述符集(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并选择教程
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- Winsock2 select():同一个套接字上可能有多个事件吗?
- epoll_wait() 是否报告所有关闭的套接字事件
- c++套接字客户端在输出流关闭的情况下不断从Java服务器事件中接收一些内容
- WSAEventSelect,一个事件,多个套接字
- 如果客户端的互联网断开连接,客户端套接字不会关闭。如何在服务器中检测此事件?
- epoll_wait() 可以只用 1 个套接字和 1 个事件> 1 - EPOLLIN?
- 如何同时处理用户交互和套接字事件
- 基于套接字的事件循环
- poll() 似乎看不到 UDP 套接字上的事件
- C 套接字/轮询错误地返回 POLLOUT 事件