So there are multiple things called netcat; ubuntu even has /etc/alternatives symbolic-link-hackery for it.
I think part of your problem is that UDP doesn't do sessions; I've copied in part of the file /usr/share/doc/netcat-traditional/README.gz below which does a pretty good job of explaining.
UDP connections are opened instead of
TCP when -u is specified. These
aren't really "connections" per se
since UDP is a connectionless
protocol, although netcat does
internally use the "connected UDP
socket" mechanism that most kernels
support. Although netcat claims that
an outgoing UDP connection is "open"
immediately, no data is sent until
something is read from standard input.
Only thereafter is it possible to
determine whether there really is a
UDP server on the other end, and often
you just can't tell. Most UDP
protocols use timeouts and retries to
do their thing and in many cases won't
bother answering at all, so you should
specify a timeout and hope for the
best. You will get more out of UDP
connections if standard input is fed
from a source of data that looks like
various kinds of server requests.
OK so maybe that's not all that great of an explanation but it's what I could find.
If you haven't yet, you might want to experiment with any netcat options you can find that would have to do with waiting... have you experimented with:
using -l as well as -u to ensure you're in "listening" mode
-vv to see exactly what's happening
-q -1 ...which should "wait forever" even after receiving EOF (hopefully, listening again?)
Ok, I think at least I got something with socat
- namely, the option fork
needs to be appended to the server line:
$ socat - udp4-listen:5000,reuseaddr,fork
... and then, in another terminal, we can call echo
piping into socat
client line multiple times on command line, as it will exit immediately (well, after half a second :)):
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
... and going back to the first terminal, we can see that the server has successfully shown all three hello
s:
$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C
Note that even with a fork
-ed socat
server, the line echo "hello" | nc -u 127.0.0.1 5000
will still 'lock' as if waiting for user input; however, now after Ctrl-C and re-running the command, i.e.
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
... the fork
-ed socat
server will show three hello
s without the need to be restarted..
Seemingly, this openBSD netcat
doesn't have a fork
option - but I'm not sure if it has one that is corresponding to it..
Anyways, hope this helps someone,
Cheers!
Best Answer
A process is probably already listening on UDP port 2947. You can get the PID of the process by running:
Or browse the list of listening UDP ports to find your process: