No Linux, quando executo telnet <address> <port>
e digito coisas, ele armazena dados em buffer e só envia a linha coletada quando pressiono Enter. Além disso, ele armazena em buffer até 4.096 caracteres e trunca todo o resto.
Posso confirmar isso ouvindo o tráfego via tcpdump ou algo assim.
É possível enviar bytes (ou multibytes se a codificação de caracteres UTF-8 for multibyte) imediatamente quando ele aparecer? Espero ver pacotes TCP de "1 byte" (1 byte de carga útil mais cabeçalhos) na saída do tcpdump.
Ou, pelo menos, é possível forçá-lo a enviar o buffer coletado sem <cr>
ou/e <lf>
caracteres?
O
telnet
cliente, especificamente, foi projetado para se comunicar com um servidor Telnet usando o protocolo Telnet; ele mudará para o modo de caractere se receber Telnet IAC WILL SGA / IAC DO SGA do servidor.Alternativamente, você pode pressionar Ctrl]e entrar
mode character
para iniciar isso do lado do cliente; o cliente enviará as mensagens de negociação Telnet IAC para o servidor e mudará para o modo caractere por caractere. Se o servidor não for um servidor Telnet, isso resultará no recebimento de alguns caracteres inúteis antes de sua entrada.Por outro lado, para programas como
nc
ouncat
(ou seja, não clientes Telnet), que mantêm o tty local no modo "cozido", esse buffer é feito pelo tty e não pelo programa. Ou a) pressione Ctrl+D em qualquer ponto para fazer o tty retornar o texto que foi digitado até agora, ou b) usestty raw
para alternar o tty para o modo bruto antes de iniciar o programa (estty cooked iutf8 -brkint
para voltar).(Ctrl+D não é apenas a tecla EOF, é a tecla "end of read() call". Pressionar Ctrl+D em uma linha vazia , ou seja, fazer read() não retornar nada, é o que realmente dá EOF; enquanto Ctrl +D após alguma entrada retornará apenas essa entrada, sem nenhum CR/LF final.)