On Sun, Jun 24, 2012 at 11:23:05PM +0200, Ariane van der Steldt wrote: > On Mon, Jun 25, 2012 at 12:09:33AM +0300, dsp wrote: > > We observe the following behaviour when running nc -ul. > > The server begins on a recvfrom() and when data arrives it > > connects() the socket. > > When the client dies , the server remains in a connected state > > therefore ignoring subsequent data arriving on the port. > > Is this really the intended logic for a connectionless protocol like > > UDP? We proceeded to comment out the connect statement and we were > > able to receive data from multiple *sessions* as expected. > > Can you shed some light on the matter??? > > Reading the man page, I think you want to add the -k option to nc.
The -k option does nothing when used with -u because the readwrite() session cannot end. Would the following be a reasonable change? It has the side effect of letting UDP packets to interleave. Index: nc.1 =================================================================== RCS file: /cvs/src/usr.bin/nc/nc.1,v retrieving revision 1.60 diff -u -p -r1.60 nc.1 --- nc.1 7 Feb 2012 12:11:43 -0000 1.60 +++ nc.1 25 Jun 2012 10:40:15 -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 all UDP datagrams arriving on the port are received; +not just those sent by the first client to connect. .It Fl l Used to specify that .Nm Index: netcat.c =================================================================== RCS file: /cvs/src/usr.bin/nc/netcat.c,v retrieving revision 1.105 diff -u -p -r1.105 netcat.c --- netcat.c 9 Feb 2012 06:25:35 -0000 1.105 +++ netcat.c 25 Jun 2012 10:40:15 -0000 @@ -364,9 +364,12 @@ main(int argc, char *argv[]) if (rv < 0) err(1, "recvfrom"); - rv = connect(s, (struct sockaddr *)&z, len); - if (rv < 0) - err(1, "connect"); + if (!kflag) { + rv = connect(s, (struct sockaddr *)&z, + len); + if (rv < 0) + err(1, "connect"); + } readwrite(s); } else {