Plasma GitLab Archive
Projects Blog Knowledge

Module Netsys_polysocket

module Netsys_polysocket: sig .. end

Polymorphic message sockets


These pipes are restricted to a single process, and can be used to send messages of any types between threads.

Types

type 'a polyendpoint = 'a Netsys_polypipe.polypipe * 'a Netsys_polypipe.polypipe 

An endpoint is simply a pair (rd,wr) where rd is a polypipe open for reading, and wr is a polypipe open for writing.

type 'a polyclient 

A client, connected or unconnected

type 'a polyserver 

A server

Clients

val create_client : int -> 'a polyclient

Create a new socket client. The int is the number of messages in the pipe buffer.

val connect : 'a polyclient -> 'a polyserver -> unit

Requests the connection with this server. This function returns always immediately.

Possible Unix.unix_error codes:

  • EALREADY
  • EISCONN
val endpoint : synchronous:bool ->
nonblock:bool ->
'a polyclient -> 'a polyendpoint

Returns the endpoint once connected. In asynchronous mode, the connect is immediately successful. In synchronous mode, it is awaited that the server accepts the connection. If also nonblock is true, the Unix_error EAGAIN is returned if such waiting is needed.

Possible Unix.unix_error codes:

  • EAGAIN: the client is non-blocking, and the connection is not yet established
  • EINTR: a signal arrived
  • ECONNREFUSED: the server went down in the meantime
  • ENOTCONN: no previous connect

If called several times, this function always returns the same endpoint.

val close_client : 'a polyclient -> unit

Closes the client and the endpoint. Further interactions with the client raise the exception Netsys_polypipe.Closed.

val set_connect_notify : 'a polyclient -> (unit -> unit) -> unit

set_connect_notify cl f: Sets that the function f is called when the connection is accepted. There can only be one such function; any previous function is overwritten. Only future connect events are reported. The function is called from a different thread.

val connect_descr : 'a polyclient -> Unix.file_descr

Returns a descriptor that can be used for polling. This is only meaningful for synchronous connects. When the descriptor is readable the connection is accepted, and calling endpoint again is promising.

If connect_descr is called several times, always the same descriptor is returned.

The caller has to close the descriptor after use.

You can call this function only after connect.

Servers

val create_server : unit -> 'a polyserver

Create a new socket server.

Note that a server needs 2-6 file descriptors in the current implementation.

val accept : nonblock:bool ->
'a polyserver -> 'a polyendpoint

Accepts the next connection (or returns the next connection from the backlog queue). If the server is blocking, this function waits until the connection is established.

Possible Unix.unix_error codes:

  • EAGAIN: the server is non-blocking, and no connection attempt is pending
  • EINTR: a signal arrived
val refuse : nonblock:bool -> 'a polyserver -> unit

All pending connection attempts will be refused. The clients will get ECONNREFUSED. It is possible to return to accepting connections.

For a non-blocking refuse you need to call refuse again after catching EAGAIN.

val pending_connection : 'a polyserver -> bool

Whether there is a client waiting for being accepted

val close_server : 'a polyserver -> unit

Closes the server. The accepted endpoints need to be closed separately.

Further interactions with the server cause that the exception Netsys_polypipe.Closed will be raised.

val set_accept_notify : 'a polyserver -> (unit -> unit) -> unit

set_accept_notify srv f: Sets that the function f is called when a new connection arrives. There can only be one such function; any previous function is overwritten. The event is edge-triggered: when several connections arrive the function is only called once. The function is called from a different thread.

val accept_descr : 'a polyserver -> Unix.file_descr

Returns a descriptor that can be used for polling. When the descriptor is readable a pending connection exists. If called several times, always the same descriptor is returned.

The caller has to close the descriptor after use.

You can call this function before or after accept.

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml