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



netcat的一个很酷的特性是它可以将任何命令行程序变成服务器。例如,在Unix系统上,我们可以通过将date二进制文件传递给netcat来制作一个简单的日期服务器,这样它的stdout就可以通过套接字发送:

netcat -l -p 2020 -e date

然后,我们可以通过简单地发出以下命令从另一台机器调用此服务:

netcat <ip-address> 2020

即使是一个shell也可以连接(/bin/sh),尽管我知道这是高度未注释的,并且具有很大的安全隐患。

类似地,我尝试制作自己的简单C程序,既可以从stdinstdout:中读写

#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, %sn", buffer);
return 0;
}

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

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

我需要做什么才能让我的问候语最初通过套接字发送,然后等待输入,然后发送最后的消息(就像我直接调用二进制文件一样)?

我知道可能有更好(也可能更安全)的方法来实现这样的系统,但我对netcat的功能以及为什么它不起作用感到好奇。

向非终端写入时,stdout很有可能没有行缓冲。在printf之后执行fflush(stdout)

最新更新