Scheme 48 Manual | Contents | In Chapter: Libraries
Previous: Sockets | Next: Sockets

## Sockets

Structure `sockets` provides access to TCP/IP sockets for interprocess and network communication.

- `(open-socket) -> socket`
- `(open-socket port-number) -> socket`
- `(socket-port-number socket) -> integer`
- `(close-socket socket)`
- `(socket-accept socket) -> input-port output-port`
- `(get-host-name) -> string`

`Open-socket` creates a new socket. If no `port-number` is supplied the system picks one at random. `Socket-port-number` returns a socket's port number. `Close-socket` closes a socket, preventing any further connections. `Socket-accept` accepts a single connection on `socket`, returning an input port and an output port for communicating with the client. If no client is waiting `socket-accept` blocks until one appears. `Get-host-name` returns the network name of the machine.

- `(socket-client host-name port-number) -> input-port output-port`

`Socket-client` connects to the server at `port-number` on the machine named `host-name`. `Socket-client` blocks until the server accepts the connection.

The following simple example shows a server and client for a centralized UID service.

>     (define (id-server)
>       (let ((socket (open-socket)))
>         (display "Waiting on port ")
>         (display (socket-port-number socket))
>         (newline)
>         (let loop ((next-id 0))
>           (call-with-values
>             (lambda ()
>               (socket-accept socket))
>             (lambda (in out)
>               (display next-id out)
>               (close-input-port in)
>               (close-output-port out)
>               (loop (+ next-id 1)))))))

>     (define (get-id machine port-number)
>       (call-with-values
>         (lambda ()
>           (socket-client machine port-number))
>         (lambda (in out)
>           (let ((id (read in)))
>             (close-input-port in)
>             (close-output-port out)
>             id))))

Previous: Sockets | Next: Sockets