From: Aron Xu Date: Mon, 13 Feb 2012 15:38:15 +0800 Subject: verbose numeric port --- netcat.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/netcat.c b/netcat.c index baab909..eb3453e 100644 --- a/netcat.c +++ b/netcat.c @@ -41,6 +41,7 @@ #include #include #include +#include #ifndef IPTOS_LOWDELAY # define IPTOS_LOWDELAY 0x10 @@ -424,6 +425,18 @@ main(int argc, char *argv[]) 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, we will use recvfrom() initially * to wait for a caller, then use the regular @@ -432,16 +445,15 @@ main(int argc, char *argv[]) if (uflag) { int rv, plen; char buf[16384]; - struct sockaddr_storage z; - len = sizeof(z); + len = sizeof(cliaddr); plen = jflag ? 16384 : 2048; rv = recvfrom(s, buf, plen, MSG_PEEK, - (struct sockaddr *)&z, &len); + (struct sockaddr *)&cliaddr, &len); if (rv < 0) err(1, "recvfrom"); - rv = connect(s, (struct sockaddr *)&z, len); + rv = connect(s, (struct sockaddr *)&cliaddr, len); if (rv < 0) err(1, "connect"); @@ -450,6 +462,45 @@ main(int argc, char *argv[]) len = sizeof(cliaddr); connfd = accept(s, (struct sockaddr *)&cliaddr, &len); + if(vflag) { + /* Don't look up port if -n. */ + if (nflag) + sv = NULL; + else + sv = getservbyport(ntohs(atoi(uport)), + uflag ? "udp" : "tcp"); + + if (((struct sockaddr *)&cliaddr)->sa_family == AF_INET) { + char dst[INET_ADDRSTRLEN]; + inet_ntop(((struct sockaddr *)&cliaddr)->sa_family,&(((struct sockaddr_in *)&cliaddr)->sin_addr),dst,INET_ADDRSTRLEN); + fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n", + dst, + uport, + uflag ? "udp" : "tcp", + sv ? sv->s_name : "*", + ((struct sockaddr *)(&cliaddr))->sa_family, + ntohs(((struct sockaddr_in *)&cliaddr)->sin_port)); + } + else if(((struct sockaddr *)&cliaddr)->sa_family == AF_INET6) { + char dst[INET6_ADDRSTRLEN]; + inet_ntop(((struct sockaddr *)&cliaddr)->sa_family,&(((struct sockaddr_in6 *)&cliaddr)->sin6_addr),dst,INET6_ADDRSTRLEN); + fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n", + dst, + uport, + uflag ? "udp" : "tcp", + sv ? sv->s_name : "*", + ((struct sockaddr *)&cliaddr)->sa_family, + ntohs(((struct sockaddr_in6 *)&cliaddr)->sin6_port)); + } + else { + fprintf(stderr, "Connection from unknown port %s [%s/%s] accepted (family %d, sport %d)\n", + uport, + uflag ? "udp" : "tcp", + sv ? sv->s_name : "*", + ((struct sockaddr *)(&cliaddr))->sa_family, + ntohs(((struct sockaddr_in *)&cliaddr)->sin_port)); + } + } readwrite(connfd); close(connfd); } --