将用户输入重定向到 /dev/null
Redirect user input to /dev/null
您好,我正在尝试实现一个聊天客户端 - 服务器,并希望所有客户端输入的文本都不会在客户端本地打印。
因此,一旦用户按下回车键,数据就应该只发送到服务器,而不是 STDOUT。然后服务器应该将此数据发送回我和所有其他客户端,然后才显示此数据。
这可能吗?
当不对 FD 进行任何操作时,我只会得到重复的数据,当尝试将 STDOUT 重定向到 /dev/null 时 - 我仍然在屏幕上看到用户输入的数据。(按下回车键后我只是想让它清除屏幕,也许?)
使用这段代码我得到两行输出:
void * rcv_from_srv_thread(void * sock_fd_ptr)
{
char recv_buf[BUF_SIZE] = {};
int len = 0;
int sock_fd = *(int *)sock_fd_ptr;
while (1)
{
if ((len = recv(sock_fd, recv_buf, BUF_SIZE, 0)) < 0)
{
perror("recv failed");
return NULL;
}
recv_buf[len] = '[=11=]';
printf("%s", recv_buf);
}
assert(0);
return NULL;
}
void * send_to_srv_thread(void * sock_fd_ptr)
{
char send_buf[BUF_SIZE] = {};
int len;
int sock_fd = *(int *)sock_fd_ptr;
do
{
fgets(send_buf, BUF_SIZE, stdin);
if ((len = send(sock_fd, send_buf, strlen(send_buf), 0)) < 0)
{
perror("send failed");
return NULL;
}
} while(1);
assert(0);
return NULL;
}
当运行客户:
root@sergey-VirtualBox:~/chat/client# ./client
aaaa
got server IP - 127.0.0.1
asdasd
asdasd
ddd
ddd
它可能不是最好的或最干净的,但至少可能是最简单的。您只需将光标在 fgets 运行 之后向上移动一行到开头,输入的行将被覆盖:
// fgets(…)
printf("%c[A\r", 27);
// …
您可以将光标向上移动,然后在打印前清空整行
#define CSI "\x1B["
printf(CSI "F" CSI "2K");
printf("This is a message.\n");
您好,我正在尝试实现一个聊天客户端 - 服务器,并希望所有客户端输入的文本都不会在客户端本地打印。 因此,一旦用户按下回车键,数据就应该只发送到服务器,而不是 STDOUT。然后服务器应该将此数据发送回我和所有其他客户端,然后才显示此数据。
这可能吗?
当不对 FD 进行任何操作时,我只会得到重复的数据,当尝试将 STDOUT 重定向到 /dev/null 时 - 我仍然在屏幕上看到用户输入的数据。(按下回车键后我只是想让它清除屏幕,也许?)
使用这段代码我得到两行输出:
void * rcv_from_srv_thread(void * sock_fd_ptr)
{
char recv_buf[BUF_SIZE] = {};
int len = 0;
int sock_fd = *(int *)sock_fd_ptr;
while (1)
{
if ((len = recv(sock_fd, recv_buf, BUF_SIZE, 0)) < 0)
{
perror("recv failed");
return NULL;
}
recv_buf[len] = '[=11=]';
printf("%s", recv_buf);
}
assert(0);
return NULL;
}
void * send_to_srv_thread(void * sock_fd_ptr)
{
char send_buf[BUF_SIZE] = {};
int len;
int sock_fd = *(int *)sock_fd_ptr;
do
{
fgets(send_buf, BUF_SIZE, stdin);
if ((len = send(sock_fd, send_buf, strlen(send_buf), 0)) < 0)
{
perror("send failed");
return NULL;
}
} while(1);
assert(0);
return NULL;
}
当运行客户:
root@sergey-VirtualBox:~/chat/client# ./client
aaaa
got server IP - 127.0.0.1
asdasd
asdasd
ddd
ddd
它可能不是最好的或最干净的,但至少可能是最简单的。您只需将光标在 fgets 运行 之后向上移动一行到开头,输入的行将被覆盖:
// fgets(…)
printf("%c[A\r", 27);
// …
您可以将光标向上移动,然后在打印前清空整行
#define CSI "\x1B["
printf(CSI "F" CSI "2K");
printf("This is a message.\n");