From: Aron Xu Date: Tue, 14 Feb 2012 23:02:00 +0800 Subject: serialized handling multiple clients --- netcat.c | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) --- a/netcat.c +++ b/netcat.c @@ -664,7 +664,20 @@ main(int argc, char *argv[]) s = unix_bind(host, 0); else s = unix_listen(host); - } + } else + s = local_listen(host, uport, hints); + if (s < 0) + err(1, NULL); + + char* local; + if (family == AF_INET6) + local = ":::"; + else + local = "0.0.0.0"; + fprintf(stderr, "Listening on [%s] (family %d, port %d)\n", + host ?: local, + family, + *uport); # if defined(TLS) if (usetls) { @@ -678,22 +691,7 @@ main(int argc, char *argv[]) # endif /* Allow only one connection at a time, but stay alive. */ for (;;) { - if (family != AF_UNIX) - s = local_listen(host, uport, hints); - if (s < 0) - err(1, NULL); - - char* local; - if (family == AF_INET6) - local = "0.0.0.0"; - else if (family == AF_INET) - local = ":::"; - else - local = "unknown"; - fprintf(stderr, "Listening on [%s] (family %d, port %d)\n", - host ?: local, - family, - *uport); + /* * For UDP and -k, don't connect the socket, let it * receive datagrams from multiple socket pairs. @@ -760,15 +758,16 @@ main(int argc, char *argv[]) # endif close(connfd); } - if (family != AF_UNIX) + if (kflag) + continue; + if (family != AF_UNIX) { close(s); + } else if (uflag) { if (connect(s, NULL, 0) < 0) err(1, "connect"); } - - if (!kflag) - break; + break; } } else if (family == AF_UNIX) { ret = 0;