I want a UDP echo server to get packets, and reply exactly what it has received. How can I simply do this using netcat or socat? It should stay alive forever and handle packets coming from several hosts.

  • 8
    Please don't make this thing Internet-accessible. Since it's UDP-based it can be used to send a packet stream to arbitrary destinations using source-forged packets. Jan 6, 2012 at 5:47

6 Answers 6


Another netcat-like tool is the nmap version, ncat, that has lots of built in goodies to simplify things like this. This would work:

ncat -e /bin/cat -k -u -l 1235

-e means it executes /bin/cat (to echo back what you type)
-k means keep-alive, that it keeps listening after each connection
-u means udp
-l 1235 means that it listens on port 1235


I used socat -v PIPE udp-recvfrom:5553,fork to run the server and socat - udp:localhost:5553 for clients. This was a great help!


You can also use socat (rather than using netcat) as echo server and netcat as client.

Socat echo server (listens on TCP port 1234):

socat -v tcp-l:1234,fork exec:'/bin/cat'

Netcat client (connects to serverip on TCP port 1234):

nc serverip 1234

netcat solution pre-installed in Ubunutu

The netcat pre-installed in Ubuntu 16.04 comes from netcat-openbsd, and has no -c option, but the manual gives a solution:

sudo mknod -m 777 fifo p
cat fifo | netcat -l -k localhost 8000 > fifo

Then client example:

echo abc | netcat localhost 8000

TODO: how to modify the input string value? The following does not return any reply:

cat fifo | tr 'a' 'b' | netcat -l -k localhost 8000 > fifo

The remote shell example however works:

cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo

I don't know how to deal with concurrent requests simply however.


You can write a C program that forks nc -u -l -p 4321 and then uses dup(2) to connect:

  • nc stdin with the parent's stdout
  • nc stdout with the parent's stdin

Then in an endless loop the parent reads from stdin and writes in stdout whatever the parent reads.

  • I can use socat -v PIPE UDP-LISTEN:5555,fork, but the second connection gets refused. By the way, it works fine with TCP-LISTEN. I am avoiding to code, otherwise I could write it all in C. Jan 4, 2012 at 13:16
  • You have to wrap the whole thing in an endless loop: while true; do socat stuff; done
    – adamo
    Jan 4, 2012 at 18:53
  • You may also get some inspiration using this tutorial
    – adamo
    Jan 4, 2012 at 19:16

If you are running on Windows and use a unix like environment like cygwin, netcat migth not provide the -e parameter. This worked just fine for me.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.