将简单的C程序使用netcat转换为服务器

5
< p > netcat 的一个很酷的功能是它可以将任何命令行程序变成服务器。例如,在 Unix 系统上,我们可以通过将 date 二进制文件传递给 netcat,使其 stdout 通过套接字发送来创建一个简单的日期服务器:

netcat -l -p 2020 -e date

那么我们可以通过简单地发出命令来从另一台机器上调用此服务:
netcat <ip-address> 2020

即使是一个 shell 也可以连接(/bin/sh),但我知道这是极不推荐的,会有很大的安全隐患。

同样地,我尝试编写自己的简单 C 程序,既可以从 stdin 读取,也可以向 stdout 写入:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    char buffer[20];
    printf("Please enter your name:\n");
    fgets(buffer, 20, stdin);
    printf("Hello there, %s\n", buffer);
    return 0;
}

然而,当我从另一个终端调用该服务时,没有初始的问候语;事实上,只有在发送一些信息之后,才会打印问候语。例如:

user@computer:~$ netcat localhost 2020
User
Please enter your name:
Hello there, User

我需要怎样做才能通过套接字发送我的问候语,然后等待输入,最后发送最终消息(就像我直接调用二进制文件一样)?
我知道可能有更好(和可能更安全)的方法来实现这样的系统,但我对netcat的功能很感兴趣,想知道为什么这不起作用。
1个回答

5

在向非终端写入时,stdout 很可能不是按行缓冲的。在 printf 后面加上 fflush(stdout)


1
您还可以使用不缓冲的dprintf()函数。 - Jean
@Phibonacci 如果您有文件描述符,这是一个非常好的建议。 - cnicutar
谢谢大家的帮助,这确实指引了我正确的方向。我刚刚找到了另一个有效的解决方案。缓冲也可以通过调用setbuf来禁用,例如:setbuf(stdout, NULL); - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接