将用户输入重定向到/ dev / null

时间:2017-11-25 11:48:49

标签: c file-descriptor

您好我正在尝试实现聊天客户端 - 服务器,并且希望所有客户端输入的文本都不在本地打印在客户端上。 因此,一旦用户点击进入,数据应仅发送到服务器而不是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] = '\0';
        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

2 个答案:

答案 0 :(得分:1)

它可能不是最好的或最干净的,但至少可能是最简单的。您只需在运行fgets后向上移动光标一行,然后输入的行将被覆盖:

// fgets(…)
printf("%c[A\r", 27);

// …

答案 1 :(得分:0)

您可以向上移动光标,然后在打印前清除整行

#define CSI "\x1B["
printf(CSI "F" CSI "2K");
printf("This is a message.\n");