Risposte:
Utilizzando nc
( netcat
).
Server:
$ nc -l localhost 3000
Cliente:
$ nc localhost 3000
Sia il server che il client leggeranno e scriveranno sull'output / input standard.
Funzionerà quando sia il server che il client si trovano sulla stessa macchina. In caso contrario, passare localhost
al nome esterno del server.
Leggermente più interessante, un "server" che ti dà l'ora del giorno se ti connetti ad esso e lo invii a d
, e che si chiude se invii q
:
Server (in bash
):
#!/bin/bash
coproc nc -l localhost 3000
while read -r cmd; do
case $cmd in
d) date ;;
q) break ;;
*) echo 'What?'
esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"
kill "$COPROC_PID"
Sessione cliente:
$ nc localhost 3000 d Gio 12 gen 18:04:21 CET 2017 Ciao? Che cosa? q
(il server esce dopo q
, ma il client non rileva che è andato fino a quando non si preme Enter).
In generale consiglio con netcat
è il modo migliore.
Ma dentro bash
e ksh
puoi anche fare questo:
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
1>&3
? Non sono sicuro di ciò che rappresenta
echo "request" >&3
, immagino che il 1 sia solo ridondante
prova netcat (es. nc)
echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
echo GET / HTTP/1.0
) al mio server http localeIn molti casi non ho avuto accesso a netcat / socat. Ho anche avuto problemi con l'utilizzo di bash exec
in un ambiente informatico distribuito.
Per la sua prevalenza, una soluzione alternativa è quella di utilizzare le funzionalità TCP / IP di GNU AWK. Fornisce una sintassi semplice basata sul suo operatore "pipe a due vie".
Ecco un esempio modificato da questa fonte che invierà un messaggio TCP su un socket:
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
La sintassi completa per l'indirizzo è il seguente: /net-type/protocol/local-port/remote-host/remote-port
. Quando local-port
è impostato su 0, l'host locale sceglie automaticamente la porta, che in genere è quella desiderata. Si può leggere di più su gawk
's rete TCP / IP funzionalità qui:
ctrl+c
non mostrerà il risultato. Se si utilizza echo, ad esempioecho "cookie" | nc localhost 9090
, il flusso di output del client verrà chiuso (eof inviato) ma il client attenderà comunque il risultato del server.