Skip to content

Listener

Description

A bound + listening socket. kind records whether stream (TCP) or datagram (UDP) semantics apply. bound is the address that was passed to ListenerOpen (mostly for logging); see ListenerLocalAddr for the actually-bound address when the caller asked the kernel to pick the port.

Usage example (Cross-references)

Usage examples (Cross-references)
        SocketKind kind;
        SocketAddr bound;
    } Listener;
    
    ///
    /// TAGS: Socket, Listener, Bind
    ///
    bool ListenerOpen(Listener *out, SocketKind kind, const SocketAddr *addr, i32 backlog);
    
    ///
    /// TAGS: Socket, Listener, Address
    ///
    bool ListenerLocalAddr(const Listener *self, SocketAddr *out);
    
    ///
    /// TAGS: Socket, Listener, Accept
    ///
    bool ListenerAccept(Listener *self, Socket *out_conn);
    
    ///
    /// TAGS: Socket, Listener, Close
    ///
    void ListenerClose(Listener *self);
    
    // --- Socket (client + accepted) --------------------------------------------
    // ---------------------------------------------------------------------------
    
    bool ListenerOpen(Listener *out, SocketKind kind, const SocketAddr *addr, i32 backlog) {
        if (!out || !addr) {
            LOG_FATAL("ListenerOpen: NULL argument");
    }
    
    bool ListenerLocalAddr(const Listener *self, SocketAddr *out) {
        if (!self || !out) {
            LOG_FATAL("ListenerLocalAddr: NULL argument");
    }
    
    bool ListenerAccept(Listener *self, Socket *out_conn) {
        if (!self || !out_conn) {
            LOG_FATAL("ListenerAccept: NULL argument");
    }
    
    void ListenerClose(Listener *self) {
        if (!self) {
            return;
            DnsResolverDeinit(&resolver);
    
            Listener listener;
            if (!ListenerOpen(&listener, SOCKET_KIND_TCP, &listen_addr, 128)) {
                LOG_ERROR("failed to open listener on {}", listen_spec);
        }
    
        Listener listener;
        if (!ListenerOpen(&listener, SOCKET_KIND_TCP, &bind_addr, 16)) {
            DefaultAllocatorDeinit(&alloc);
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client = {0};
        Socket   server = {0};
    // is the accepted side. Both must be closed by the caller.
    typedef struct Pair {
        Listener listener;
        Socket   client;
        Socket   server;
        }
    
        Listener listener;
        if (!ListenerOpen(&listener, SOCKET_KIND_TCP, &bind_addr, 16)) {
            // Port may be in use by a stale TIME_WAIT from a prior run; treat as
        }
    
        Listener listener;
        if (!ListenerOpen(&listener, SOCKET_KIND_TCP, &bind_addr, 16)) {
            DefaultAllocatorDeinit(&alloc);
        }
    
        Listener listener;
        if (!ListenerOpen(&listener, SOCKET_KIND_TCP, &bind_addr, 16)) {
            DefaultAllocatorDeinit(&alloc);
        MemSet(&bad, 0, sizeof(bad)); // family = SOCKET_FAMILY_UNSPEC
    
        Listener listener;
        bool     opened = ListenerOpen(&listener, SOCKET_KIND_TCP, &bad, 16);
        return opened == false;
        }
    
        Listener listener;
        if (!ListenerOpen(&listener, SOCKET_KIND_TCP, &bind_addr, 16)) {
            return false;
    // failure everything opened so far is torn down and false is returned.
    // ---------------------------------------------------------------------------
    static bool sk4_make_pair(Allocator *a, Listener *listener, Socket *client, Socket *server, SocketAddr *local_out) {
        *client = (Socket) {0};
        *server = (Socket) {0};
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener   listener;
        Socket     client;
        Socket     server;
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        Allocator       *a     = ALLOCATOR_OF(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
Last updated on