Network or UNIX-domain socket
OpenBSD
‘s netcat
can support both network(based on TCP/IP
or UDP/IP
) and UNIX-domain
sockets. netcat
will use network sockets by default except you specify -U
option. E.g, create and listen on a UNIX-domain
socket:
nc -lU /var/tmp/unix-socket
-l
option lets netcat
work in server mode. There is a lflag
which identifies netcat
launched as server or client:
int lflag; /* Bind to local port */
Regarding to network socket, netcat
has 2
options to specify using IPv4
only or IPv6
only:
-4 Use IPv4 addresses only.
-6 Use IPv6 addresses only.
Netcat
program has a family
variable which denotes using IPv4
, IPv6
or UNIX-domain
socket:
int family = AF_UNSPEC;
During parsing options, lflag
and family
will be assigned different values accordingly:
while ((ch = getopt(argc, argv, ...))) {
......
switch (ch) {
case '4':
family = AF_INET;
break;
case '6':
family = AF_INET6;
break;
case 'U':
family = AF_UNIX;
break;
......
case 'l':
lflag = 1;
break;
......
}
}
Netcat
will accept one or two arguments:
argc -= optind;
argv += optind;
......
/* Cruft to make sure options are clean, and used properly. */
if (argv[0] && !argv[1] && family == AF_UNIX) {
host = argv[0];
uport = NULL;
} else if (argv[0] && !argv[1]) {
if (!lflag)
usage(1);
uport = argv[0];
host = NULL;
} else if (argv[0] && argv[1]) {
host = argv[0];
uport = argv[1];
} else
usage(1);
If it is UNIX-domain
, netcat
only needs one argument which is the UNIX-domain
socket file. If it is network socket, client must have two arguments: server IP
address and port; server can omit IP
address and only has port.
What IP
protocol version will be used by TCP/IP
server if neither -4
nor -6
is provided in option? The answer is IPv4
. In local_listen
function:
/*
* In the case of binding to a wildcard address
* default to binding to an ipv4 address.
*/
if (host == NULL && hints.ai_family == AF_UNSPEC)
hints.ai_family = AF_INET;
“host == NULL
“ means you don’t designate an IP
address for server, like following example:
# nc -l 3003