diff -up nmap-6.01/ncat/ncat_core.c.shutdown nmap-6.01/ncat/ncat_core.c diff -up nmap-6.01/ncat/ncat_core.h.shutdown nmap-6.01/ncat/ncat_core.h diff -up nmap-6.01/ncat/ncat_listen.c.shutdown nmap-6.01/ncat/ncat_listen.c --- nmap-6.01/ncat/ncat_listen.c.shutdown 2012-03-01 07:53:35.000000000 +0100 +++ nmap-6.01/ncat/ncat_listen.c 2012-11-22 18:14:05.991381724 +0100 @@ -317,10 +317,13 @@ static int ncat_listen_stream(int proto) }else { /* Read from stdin and write to all clients. */ rc = read_stdin(); - if (rc == 0 && o.sendonly) - /* There will be nothing more to send. If we're not - receiving anything, we can quit here. */ - return 0; + if (rc == 0) { + if (o.sendonly) + /* There will be nothing more to send. If we're not + receiving anything, we can quit here. */ + return 0; + shutdown_sockets(SHUT_WR); + } if (rc < 0) return 1; } @@ -495,6 +498,19 @@ int read_stdin(void) return nbytes; } +void shutdown_sockets(int how) +{ + struct fdinfo *fdn; + int i; + for (i = 0; i <= broadcast_fdlist.fdmax; i++) { + if (!FD_ISSET(i, &master_broadcastfds)) + continue; + + fdn = get_fdinfo(&broadcast_fdlist, i); + shutdown(fdn->fd, how); + } +} + /* Read from a client socket and write to stdout. Return the number of bytes read from the socket, or -1 on error. */ int read_socket(int recv_fd)