Пример #1
0
static client_t *create_client(server_t *s, mrp_transport_t *lt)
{
    mrp_transport_t *t;
    client_t        *c;

    c = mrp_allocz(sizeof(*c));

    if (c != NULL) {
        mrp_list_init(&c->hook);

        c->s  = s;
        c->id = s->next_id++;
        c->t  = mrp_transport_accept(lt, c, MRP_TRANSPORT_REUSEADDR);

        if (c->t != NULL) {
            mrp_list_append(&s->clients, &c->hook);

            return c;
        }

        mrp_free(c);
    }
    else {
        t = mrp_transport_accept(lt, NULL, MRP_TRANSPORT_REUSEADDR);
        mrp_transport_destroy(t);
    }

    return NULL;
}
Пример #2
0
static void destroy_client(client_t *c)
{
    mrp_list_delete(&c->hook);

    mrp_transport_destroy(c->t);
    client_destroy(c->c);

    mrp_free(c);
}
Пример #3
0
static mrp_transport_t *create_transport(pdp_t *pdp, const char *address)
{
    static mrp_transport_evt_t msg_evt, wrt_evt;

    mrp_transport_evt_t *e;
    mrp_transport_t     *t;
    mrp_sockaddr_t       addr;
    socklen_t            alen;
    int                  flags;
    const char          *type;

    t    = NULL;
    alen = mrp_transport_resolve(NULL, address, &addr, sizeof(addr), &type);

    if (alen <= 0) {
        mrp_log_error("Failed to resolve transport address '%s'.", address);
        return NULL;
    }

    flags = MRP_TRANSPORT_REUSEADDR;

    if (strncmp(address, "wsck", 4) != 0) {
        e = &msg_evt;

        e->connection  = msg_connect_cb;
        e->closed      = msg_closed_cb;
        e->recvmsg     = msg_recv_cb;
        e->recvmsgfrom = NULL;
    }
    else {
        e = &wrt_evt;

        e->connection     = wrt_connect_cb;
        e->closed         = wrt_closed_cb;
        e->recvcustom     = wrt_recv_cb;
        e->recvcustomfrom = NULL;

        flags |= MRP_TRANSPORT_MODE_CUSTOM;
    }

    t = mrp_transport_create(pdp->ctx->ml, type, e, pdp, flags);

    if (t != NULL) {
        if (mrp_transport_bind(t, &addr, alen) && mrp_transport_listen(t, 4))
            return t;
        else {
            mrp_log_error("Failed to bind to transport address '%s'.", address);
            mrp_transport_destroy(t);
        }
    }
    else
        mrp_log_error("Failed to create transport '%s'.", address);

    return NULL;
}
Пример #4
0
static void destroy_transport(mrp_transport_t *t)
{
    mrp_transport_destroy(t);
}