TCP偵聽器丟棄所有輸入?
我正在嘗試實現一個接受連接的 TCP 偵聽器,然後簡單地丟棄其所有輸入(它用於測試工具)。
現在,我正在使用
socat - tcp-listen:2003,fork,reuseaddr
,但這會將輸入列印到標準輸出。我不想要那個。我無法將輸出重定向到
/dev/null
,因為我在alpine/socat docker 容器中執行此操作,並且它實際上並未使用 shell,因此重定向不起作用。如果我嘗試使用
socat /dev/null tcp-listen:2003,fork,reuseaddr
,那麼任何連接都會立即斷開,大概是因為socat
無法從/dev/null
.實現 TCP 偵聽器的最佳方式是什麼?
socat /dev/null,ignoreeof tcp-listen:2003,fork,reuseaddr
最佳是一個棘手的標準,但可以看出 Docker 與 Microsoft Excel 一樣必要。☺
我們已經知道一個 Unix 程序在 EOF 之前讀取它的輸入並有效地丟棄它:
貓 > /dev/null
把它變成一個 TCP 伺服器是一個非常簡單的練習。 這就是 UCSPI-TCP 的全部意義所在。 它採用使用標準 I/O 的程序並圍繞它們包裝一個簡單的框架,使它們成為 TCP 伺服器。可以用其他東西代替
cat
並更改服務協議,而不必擔心傳輸。可以類似地用 UCSPI-LOCAL 工具替換 UCSPI-TCP 工具,並更改傳輸,而無需對cat
.有幾個 UCSPI-TCP 工具集。Daniel J. Bernstein 寫了一篇。Laurent Bercot 寫了一篇。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;對於需要關閉的 DNS 和 INFO 查找具有原始 Bernstein 預設值)
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
墊片(同時支持 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 工具(在 Linux 和 FreeBSD 上同時使用 IPv4 和 IPv6)
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'
Pape
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。經常給出答案。
- 丹尼爾 J. 伯恩斯坦 (1996)。UNIX 客戶端-伺服器程序介面。cr.yp.to.
工具集:
參考手冊:
- 丹尼爾·伯恩斯坦。該
tcpserver
程序。ucspi-tcp。- 歐文霍夫曼。
tcpserver
. ucspi-tcp6 . fehcom.des6-tcpserver4
. 勞倫特·伯科特。 s6-網路。skarnet.org。s6-tcpserver6
. 勞倫特·伯科特。 s6-網路。skarnet.org。fdmove
. 勞倫特·伯科特。 執行線。skarnet.org。redirfd
. 勞倫特·伯科特。 執行線。skarnet.org。tcpsvd
. ipsvd。格里特佩佩。銳化.org。- 喬納森·德博因·波拉德 (2019)。
tcpserver
. djbwares。軟體。- 喬納森·德博因·波拉德 (2019)。
fdredir
. 小吃指南。軟體。- 喬納森·德博因·波拉德 (2019)。
fdmove
. 小吃指南。軟體。- 喬納森·德博因·波拉德 (2019)。
tcp-socket-listen
. 小吃指南。軟體。- 喬納森·德博因·波拉德 (2019)。
tcp-socket-accept
. 小吃指南。軟體。- 喬納森·德博因·波拉德 (2019)。
tcpserver
. 小吃指南。軟體。