Establishing a TCP Connection
=============================
Let's observe a network connection at work. Type in the following
program and watch the output. Within a second, it connects via TCP
(`/inet/tcp') to the machine it is running on (`localhost'), and asks
the service `daytime' on the machine what time it is:
BEGIN {
"/inet/tcp/0/localhost/daytime" |& getline
print $0
close("/inet/tcp/0/localhost/daytime")
}
Even experienced `awk' users will find the second line strange in two
respects:
* A special file is used as a shell command that pipes its output
into `getline'. One would rather expect to see the special file
being read like any other file (`getline <
"/inet/tcp/0/localhost/daytime")'.
* The operator `|&' has not been part of any `awk' implementation
(until now). It is actually the only extension of the `awk'
language needed (apart from the special files) to introduce
network access.
The `|&' operator was introduced in `gawk' 3.1 in order to overcome
the crucial restriction that access to files and pipes in `awk' is
always unidirectional. It was formerly impossible to use both access
modes on the same file or pipe. Instead of changing the whole concept
of file access, the `|&' operator behaves exactly like the usual pipe
operator except for two additions:
* Normal shell commands connected to their `gawk' program with a `|&'
pipe can be accessed bidirectionally. The `|&' turns out to be a
quite general, useful, and natural extension of `awk'.
* Pipes that consist of a special file name for network connections
are not executed as shell commands. Instead, they can be read and
written to, just like a full-duplex network connection.
In the earlier example, the `|&' operator tells `getline' to read a
line from the special file `/inet/tcp/0/localhost/daytime'. We could
also have printed a line into the special file. But instead we just
read a line with the time, printed it, and closed the connection.
(While we could just let `gawk' close the connection by finishing the
program, in this Info file we are pedantic, and always explicitly close
the connections.)