How about this one ?
It's your original idea, but I don't like that extra indentation level,
we are already too deep.
Index: nc.1
===================================================================
RCS file: /cvs/src/usr.bin/nc/nc.1,v
retrieving revision 1.60
diff -d -u -p -r1.60 nc.1
--- nc.1 7 Feb 2012 12:11:43 -0000 1.60
+++ nc.1 7 Jul 2012 10:30:10 -0000
@@ -119,6 +119,10 @@ is completed.
It is an error to use this option without the
.Fl l
option.
+When used together with the
+.Fl u
+option, the server socket is not connected and it receives UDP datagrams from
+multiple hosts.
.It Fl l
Used to specify that
.Nm
Index: netcat.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/netcat.c,v
retrieving revision 1.108
diff -d -u -p -r1.108 netcat.c
--- netcat.c 7 Jul 2012 09:36:30 -0000 1.108
+++ netcat.c 7 Jul 2012 10:30:11 -0000
@@ -345,11 +345,17 @@ main(int argc, char *argv[])
if (s < 0)
err(1, NULL);
/*
- * For UDP, we will use recvfrom() initially
- * to wait for a caller, then use the regular
- * functions to talk to the caller.
+ * For UDP and -k, don't connect the socket, let it
+ * receive datagrams from multiple socket pairs.
*/
- if (uflag) {
+ if (uflag && kflag)
+ readwrite(s);
+ /*
+ * For UDP and not -k, we will use recvfrom() initially
+ * to wait for a caller, then use the regular functions
+ * to talk to the caller.
+ */
+ else if (uflag && !kflag) {
int rv, plen;
char buf[16384];
struct sockaddr_storage z;