我正在尝试实现一个 TCP 侦听器,它接受连接,然后简单地删除其所有输入(用于测试工具)。
现在,我正在使用socat - tcp-listen:2003,fork,reuseaddr
,但这会将输入打印到标准输出。我不想那样。
我无法将输出重定向到/dev/null
,因为我是在alpine/socat 码头集装箱,并且它实际上并没有使用 shell,因此重定向不起作用。
如果我尝试使用socat /dev/null tcp-listen:2003,fork,reuseaddr
,那么任何连接都会立即断开,大概是因为socat
无法读取/dev/null
。
实现 TCP 侦听器(将所有内容简单地丢弃在地板上)的最佳方法是什么?
答案1
socat /dev/null,ignoreeof tcp-listen:2003,fork,reuseaddr
答案2
最佳是一个棘手的标准,但可以观察到 Docker 对于这一点就像 Microsoft Excel 一样必要。 ☺
我们已经知道一个 Unix 程序会读取输入直到 EOF 并有效地丢弃它:
猫 > /dev/null
将其转变为 TCP 服务器是一个非常简单的练习。 这就是 UCSPI-TCP 的全部内容。 它采用使用标准 I/O 的程序,并在它们周围包装一个简单的框架,使它们成为 TCP 服务器。人们可以用其他东西替代cat
并更改服务协议,而不必担心传输。人们可以类似地用 UCSPI-LOCAL 工具替换 UCSPI-TCP 工具,并更改传输,而无需对cat
.
有多个 UCSPI-TCP 工具集。丹尼尔·J·伯恩斯坦写过一篇。洛朗·贝尔科特写过一篇。格里特·佩普(Gerrit Pape)写了一篇。亚当·桑普森写了一篇。我写了一篇。此外,人们可以混合和匹配多个工具集中的工具,这些东西是故意易于组合的。人们可以使用我的fdredir
或 Laurent Bercot 的redirfd
,甚至生成一个非交互式的sh
. (前两者的开销比成熟的 低sh
,并且 nosh 工具fdredir
甚至是内置的,因此它进一步避免了通过外部命令链接的开销。)
所以有几种方法可以做到这一点:
- Bernstein
tcpserver
(原始或 djbwares;不支持 IPv6)tcpserver -R -H -l 0 0.0.0.0 2003 fdredir --write 1 /dev/null cat
tcpserver -R -H -l 0 0.0.0.0 2003 redirfd -w 1 /dev/null cat
tcpserver -R -H -l 0 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
- Hoffman
tcpserver
(支持 IPv4 和 IPv6;具有原始 Bernstein 默认的 DNS 和 INFO 查找功能,需要关闭)tcpserver -R -H -l 0 ::0 2003 fdredir --write 1 /dev/null cat
tcpserver -R -H -l 0 ::0 2003 redirfd -w 1 /dev/null cat
tcpserver -R -H -l 0 ::0 2003 sh -c 'exec > /dev/null cat'
- 我的
tcpserver
shim(同时支持 IPv4 和 IPv6,但必须为每个实例运行单独的实例;具有更现代的默认值)tcpserver ::0 2003 fdredir --write 1 /dev/null cat
tcpserver ::0 2003 redirfd -w 1 /dev/null cat
tcpserver ::0 2003 sh -c 'exec > /dev/null cat'
- 我的 UCSPI-TCP 工具(同时支持 IPv4 和 IPv6,在 Linux 和 FreeBSD 上合二为一)
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept fdredir --write 1 /dev/null cat
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept redirfd -w 1 /dev/null cat
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept sh -c 'exec > /dev/null cat'
- Bercot
s6-tcpserver6
(s6-tcpserver4
IPv4 的替代品)s6-tcpserver6 ::0 2003 fdredir --write 1 /dev/null cat
s6-tcpserver6 ::0 2003 redirfd -w 1 /dev/null cat
s6-tcpserver6 ::0 2003 sh -c 'exec > /dev/null cat'
- Bercot s6-网络工具(
s6-tcpserver4
IPv4 的替代品)s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d fdredir --write 1 /dev/null cat
s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d redirfd -w 1 /dev/null cat
s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d sh -c 'exec > /dev/null cat'
- 帕普
tcpsvd
(不支持 IPv6)tcpsvd 0.0.0.0 2003 fdredir --write 1 /dev/null cat
tcpsvd 0.0.0.0 2003 redirfd -w 1 /dev/null cat
tcpsvd 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
- Sampson
onenetd
(同时支持 IPv4 和 IPv6,但必须为每个运行单独的实例)onenetd -6 ::0 2003 fdredir --write 1 /dev/null cat
onenetd -6 ::0 2003 redirfd -w 1 /dev/null cat
onenetd -6 ::0 2003 sh -c 'exec > /dev/null cat'
享受替代
十六进制转储 -C 1>&2或(无
sh
)fdmove -c 1 2 十六进制转储 -C用于服务器程序,以便您获得正在测试的客户端程序正在执行的操作的本地日志。 ☺
进一步阅读
- 协议:
- 乔纳森·德博因·波拉德 (2016)。UNIX 客户端-服务器程序接口上的 gen。经常给出的答案。
- 丹尼尔·伯恩斯坦 (1996)。UNIX 客户端-服务器程序接口。 cr.yp.to。
- 工具集:
- 参考手册:
- 丹尼尔·J·伯恩斯坦。该
tcpserver
程序。 ucspi-tcp。 - 埃尔文·霍夫曼。
tcpserver
。 ucspi-tcp6。 fehcom.de。 s6-tcpserver4
。洛朗·贝尔科特. s6 网络。 skarnet.org。s6-tcpserver6
。洛朗·贝尔科特. s6 网络。 skarnet.org。fdmove
。洛朗·贝尔科特. 执行。 skarnet.org。redirfd
。洛朗·贝尔科特. 执行。 skarnet.org。tcpsvd
。 ipsvd。格里特·帕普. smarden.org。- 乔纳森·德博因·波拉德 (2019)。
tcpserver
。 DJBwares。软件。 - 乔纳森·德博因·波拉德 (2019)。
fdredir
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2019)。
fdmove
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2019)。
tcp-socket-listen
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2019)。
tcp-socket-accept
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2019)。
tcpserver
。 小吃指南。软件。
- 丹尼尔·J·伯恩斯坦。该