我正在尝试了解一些与 TCP 相关的主题,并一直在进行实验:
以下操作正常:
过程A:nc -l 12345 | wc -c
过程B:</dev/random head -c 1k > /dev/tcp/localhost/12345
但事实并非如此:
流程A:
wc -c < /dev/tcp/localhost/12345
bash: connect: Connection refused
bash: /dev/tcp/localhost/12345: Connection refused
如果我可以将数据重定向到上的端口/dev/tcp
,为什么我不能从该端口重定向?
因为你没有连接到任何东西!打开
/dev/tcp/{HOST}/{PORT}
告诉 bash 建立一个到 的HOST:PORT
TCP 连接。因此,在您的情况下,无论数据流向哪个方向,服务器(您的nc -l {PORT}
)都需要首先运行。我会诚实的:坚持使用
nc
;虽然这是一个非常可爱的想法,但 bash 的 TCP 文件系统仿真(您在 Linux 上;与 Plan9 不同,/dev/tcp/
实际上没有!尝试ls -ld /dev/tcp
;) )有足够多的难以捕捉的极端情况,我会说你最好这样做,除非你真的想获得一个打开并连接的套接字作为stdin
或stdout
(或很少stderr
)程序的文件描述符。(nc
可以打开这样的套接字并使用替换它的标准输出freopen
,但它没有。)如果你想了解 TCP,我认为舒适的 shell 不是合适的地方;选择您选择的“适当”编程语言(无论是 C、Python、Perl,...)并打开套接字、发送数据、直接了解碎片有多么可怕,等等。