For each supported PF_* protocol family, there is a file /servers/socket/N where N is the numberic value fo the PF_* symbol. Right now PF LOCAL (a.k.a. PF_UNIX) and PF INET (together with PF INET6) are supported.

User programs open those files, and use the socket_create RPC to make a new socket. With that socket, they can use the other socket_* RPCs and also the io_* RPCs. The socket_* RPCs are essentially clones of the Unix system calls in question.

The only exception is sockaddrs, which are implemented as ports instead of the opaque data arrays they are in the system calls. You manipulate sockaddr ports with the socket_create_address, socket_fabricate_address, and socket_whatis_address calls. The sockaddr port is then used in socket calls like socket_connect and socket_accept.

PF_INET sockaddr ports are manipulated with socket_create_address from the usual struct sockaddr_in. PF_LOCAL sockaddr ports are stored by S_IFSOCK filesystem nodes; you find the address associated with a node with ifsock_getsockaddr. The file system server will get a sockaddr to return with socket_fabricate_address.