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.
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.