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, %sn", buffer);
return 0;
}
然而,当我从另一个终端调用服务时,没有初始问候语;事实上,问候语只是在发送一些信息后才打印出来的。例如:
user@computer:~$ netcat localhost 2020
User
Please enter your name:
Hello there, User
我需要做什么才能让我的问候语最初通过套接字发送,然后等待输入,然后发送最后的消息(就像我直接调用二进制文件一样)?
我知道可能有更好(也可能更安全)的方法来实现这样的系统,但我对netcat
的功能以及为什么它不起作用感到好奇。
向非终端写入时,stdout
很有可能没有行缓冲。在printf
之后执行fflush(stdout)
。