## 5.5 Example: Are We Working Right Now?

As an example, we show how to use the `finger` service from Oz. Services are programs running on a host, where communication is provided by a socket connection. A well known example is the `finger` service.

Services use the Internet domain, thus for connecting to them we need the name of the host computer (i. e.its Internet address) and the port of the socket. For this reason there is the procedure `OS.getServByName` (see Chapter 21 of ``System Modules'') which gives the port of the socket on which the service is available. Feeding

  `FingerPort={OS.getServByName finger tcp}`

binds `FingerPort` to the port number of the service.

Note that one has to specify the protocol the service uses, here the TCP protocol (as specified by the virtual string `tcp`). The port number of a service is unique for all computers, so this number does not depend on your localhost.

To get the information from this service we have to connect to the finger service. If you want to know whether the author is working right now, then you can connect to one of our computers with the Internet address `wallaby.ps.uni-sb.de` on the `FingerPort`. This is done by feeding the code shown in Program Program 5.2.

  `class FingerClient from Open.socket
  meth getInfo($)
  Is Ir
  in
  if {self read(list:Is tail:Ir len:$)}==0 then nil
  else {self getInfo(Ir)} Is
  end
  end
  end
  FC = {New FingerClient client(host:'wallaby.ps.uni-sb.de'
  port:FingerPort)}`

Program 5.2: The finger client `FC`.

For discovering whether the author is logged in, you have to send his username (in this example `schulte`) followed by a newline to the service, and then receive the information:

  `{FC write(vs:'schulte\n')}
  {Browse {FC getInfo($)}}`

For receiving the information we use the method `getInfo` which reads the entire information from the socket until it is closed (the finger service closes the connection automatically after sending its information).