Пример #1
0
/* in this implementation, mylisten() is assumed to follow mybind() */
int mylisten(mysocket_t sd, int backlog)
{
    mysock_context_t *ctx = _mysock_get_context(sd);

    assert(ctx->bound);

    MYSOCK_CHECK(ctx != NULL, EBADF);
    MYSOCK_CHECK(ctx->bound, EINVAL);

    /* set up the socket for demultiplexing */
    ctx->listening = TRUE;
    _mysock_set_backlog(ctx, backlog);

    if (_network_listen(&ctx->network_state, backlog) < 0)
        return -1;

    /* since we don't spawn an STCP worker thread for passive sockets
     * (there's no transport layer related work to do, so
     * _mysock_transport_init() is never called for such sockets), we
     * begin receiving network packets here...
     */
    if (_network_start_recv_thread(ctx) < 0)
    {
        assert(0);
        return -1;
    }

    return 0;
}
Пример #2
0
/* initiate a new STCP connection; called by myconnect() and myaccept() */
void _mysock_transport_init(mysocket_t sd, bool_t is_active)
{
    mysock_context_t *connection_context = _mysock_get_context(sd);

    assert(!connection_context->listening);
    connection_context->is_active = is_active;

    /* start a new network thread; this handles incoming data, passing it
     * up to the transport layer.  (the network input is threaded so we can
     * keep track of timeouts/when data arrives, in a portable manner
     * independent of the underlying network I/O functionality).
     */
    if (_network_start_recv_thread(connection_context) < 0)
    {
        assert(0);
        abort();
    }

    /* start a new transport layer thread */
    connection_context->transport_thread = _mysock_create_thread(
        transport_thread_func,
        connection_context,
        FALSE);
    connection_context->transport_thread_started = TRUE;
}