Estou tentando entender alguns tópicos relacionados ao TCP e tenho experimentado:
O seguinte funciona bem:
Processo A: nc -l 12345 | wc -c
Processo B:</dev/random head -c 1k > /dev/tcp/localhost/12345
Mas isso não acontece:
Processo A:
wc -c < /dev/tcp/localhost/12345
bash: connect: Connection refused
bash: /dev/tcp/localhost/12345: Connection refused
Se eu pudesse redirecionar dados para uma porta /dev/tcp
, por que não posso redirecionar a partir dela?
Porque não há nada com o qual você se conecte! A abertura
/dev/tcp/{HOST}/{PORT}
diz ao bash para estabelecer uma conexão TCP com oHOST:PORT
. Portanto, no seu caso, não importa em qual direção os dados fluam, o servidor (seunc -l {PORT}
) precisa ser executado primeiro .Serei honesto: continue com
nc
; embora seja uma ideia muito fofa, a emulação do sistema de arquivos TCP do bash (você está no Linux; ao contrário, digamos, do Plan9, não há/dev/tcp/
, na verdade! Tentels -ld /dev/tcp
;)) tem casos difíceis de capturar o suficiente que eu diria que você provavelmente está é melhor assim, a menos que você realmente queira obter um soquete aberto e conectado comostdin
oustdout
(ou raramente,stderr
) descritores de arquivo do seu programa. (nc
poderia abrir esse soquete e substituir seu stdout por ele usandofreopen
, mas isso não acontece.)Se você quiser aprender sobre TCP, não acho que o conforto do seu shell seja o lugar certo; escolha a linguagem de programação "adequada" de sua escolha (seja C, Python, Perl, …) e abra soquetes, envie dados, aprenda em primeira mão o quanto a fragmentação é terrível e assim por diante.