Server

The ymo_server is a relatively plain, TCP socket server. It is responsible for binding and listening on the server socket, handling connections (accepting, closing, and idle disconnects), and is responsible for sending and receiving raw data over the wire.

Server objects are paired with Protocols, which handle higher-level functions like parsing and domain-specific user-facing functionality. Data and event notifications are relayed to protocols via a set of Callbacks.

Data is read from the wire into a single server-owned read buffer. From there, it is dispatched to the read handler for a specific ymo_proto_t. The protocol is free to modify the contents of the receive buffer, but be aware: the buffer is considered free for reuse by the server after the protocol read callback has returned!

Info

For more information on parsing, see Protocols.

Types

struct ymo_server

Internal structure used to manage a yimmo server.

Definition
struct ymo_server {
    struct ev_io         w_accept;                           /* EV IO watcher for events on accept socket */
    ymo_ev_io_cb_t       cb_accept;                          /* Actual callback to use for accept. */
    char                 recv_buf[YMO_SERVER_RECV_BUF_SIZE]; /* TODO: configure @ runtime */
    bsat_toq_t           idle_toq;                           /* Used for idle disconnect timeouts */
    ymo_proto_t*         proto;                              /* Primary protocol for this server */
    ymo_server_config_t  config;
    int                  listen_fd; /* Socket for `listen`/`accept` */
    ymo_server_state_t   state;
    size_t               no_conn;
#if YMO_ENABLE_TLS
    SSL_CTX*             ssl_ctx;        /* Optional SSL context */
#endif /* YMO_ENABLE_TLS */
    pthread_mutex_t*     accept_mutex;
};

Functions

void ymo_accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)

This is the libev accept callback. It is invoked whenever a readiness notification is received from libev on the server listen socket.

void ymo_multiproc_accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)

This is the libev accept callback used for multi-process accepts (in which the listen FD is bound prior to fork).

It is invoked whenever a readiness notification is received from libev on the server listen socket.

See ymo_server_pre_fork() for more info.

void ymo_read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)

This is the libev read callback. It is invoked whenever a readiness notification is received from libev on a particular client connection socket indicating that a read may be performed.

void ymo_write_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)

This is the libev write callback. It is invoked whenever a readiness notification is received from libev on a particular client connection socket, indicating that a write may be performed.