Voglio un server echo UDP per ottenere i pacchetti e rispondere esattamente a ciò che ha ricevuto. Come posso semplicemente farlo usando netcat
o socat
? Dovrebbe rimanere in vita per sempre e gestire i pacchetti provenienti da più host.
Voglio un server echo UDP per ottenere i pacchetti e rispondere esattamente a ciò che ha ricevuto. Come posso semplicemente farlo usando netcat
o socat
? Dovrebbe rimanere in vita per sempre e gestire i pacchetti provenienti da più host.
Risposte:
Un altro strumento simile a netcat è la versione nmap ncat
, che ha molte chicche integrate per semplificare cose come questa. Questo funzionerebbe:
ncat -e /bin/cat -k -u -l 1235
-e significa che esegue / bin / cat (per ripetere ciò che digiti)
-k significa keep-alive, che continua ad ascoltare dopo ogni connessione
-u significa udp
-l 1235 significa che è in ascolto sulla porta 1235
Ho usato socat -v PIPE udp-recvfrom:5553,fork
per eseguire il server e socat - udp:localhost:5553
per i client.
Questo è stato di grande aiuto!
socat TCP4-LISTEN:2000,fork EXEC:cat
È inoltre possibile utilizzare socat (anziché utilizzare netcat) come server echo e netcat come client.
Socat echo server (ascolta sulla porta TCP 1234):
socat -v tcp-l:1234,fork exec:'/bin/cat'
Client Netcat (si collega a serverip sulla porta TCP 1234):
nc serverip 1234
È possibile scrivere un programma C che esegue il fork nc -u -l -p 4321
e quindi utilizza dup (2) per connettersi:
Quindi in un ciclo infinito il genitore legge da stdin e scrive in stdout qualunque cosa il genitore legga.
socat -v PIPE UDP-LISTEN:5555,fork
, ma la seconda connessione viene rifiutata. A proposito, funziona benissimo con TCP-LISTEN. Sto evitando il codice, altrimenti potrei scrivere tutto in C.
Se si esegue Windows e si utilizza un ambiente simile a unix come cygwin, netcat migth non fornisce il parametro -e. Questo ha funzionato bene per me.
netcat
soluzione preinstallata in Ubunutu
Il netcat
preinstallato in Ubuntu 16.04 proviene netcat-openbsd
e non ha -c
opzioni, ma il manuale offre una soluzione:
sudo mknod -m 777 fifo p
cat fifo | netcat -l -k localhost 8000 > fifo
Quindi esempio client:
echo abc | netcat localhost 8000
TODO: come modificare il valore della stringa di input? Quanto segue non restituisce alcuna risposta:
cat fifo | tr 'a' 'b' | netcat -l -k localhost 8000 > fifo
L'esempio della shell remota funziona comunque:
cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo
Tuttavia, non so come gestire le richieste simultanee.