我正在使用posix套接字在c中编写一个简单的聊天室应用程序。 但是,我在发送邮件时会遇到此问题。
(client1)say something: Hello folks! what are
client2 said: xyzabc
client3 said: dsgh
上面是客户端1的终端窗口,他试图发送"你好!你在做什么?" 但是在他写下他的消息并按输入之前,client2和client3发送了一些东西。(用于接收消息的单独线程)
我试图通过为每个客户端使用2个不同的终端窗口来解决这个问题,一个用于编写消息,另一个用于显示聊天消息。
首先,我通过编写
打开了一个gnome-terminal窗口system("gnome-terminal");
但现在,
我想在我打开的终端窗口和现有窗口上执行一些读写操作。
printf("This is existing window"); //want to print this on existing terminal
printf("this is new terminal window"); //want to print this on new terminal
scanf("%d",&a); //take input from existing window
scanf("%d",&b); //take input from new window
我已阅读here我可以通过正确的/dev/pts/<n>
文件读取/写入来完成此操作。
但是如何在当前终端的/dev/pts/<n>
和我刚刚打开的新终端窗口中找到n?有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
一种已知的好方法是使用alternate interface到GNU Readline:
某些应用程序需要将键盘I / O与文件,设备或窗口系统I / O交错,通常使用主循环在各种文件描述符上选择()。为了满足这种需要,readline也可以作为“回调”来调用。来自事件循环的函数。
伪代码骨架如下:
rl_callback_handler_install (prompt, my_handler)
while true
wait on stdin and socket (select or poll)
if stdin is ready
rl_callback_read_char();
if socket is ready
read message from socket
save readline state
print message
restore readline state
void my_handler(char* line)
send line to socket
保存和恢复readline状态是
saved_line = rl_copy_text(0, rl_end);
rl_save_prompt();
rl_replace_line("", 0);
rl_redisplay();
rl_restore_prompt();
rl_replace_line(saved_line, 0);
rl_point = saved_point;
rl_redisplay();
free(saved_line);
可以找到使用此方法的完整(如果是基本的)聊天程序here。