Skip to content

SocketClose

Description

Close a connected socket. Safe to call on a zeroed Socket.

Success

Socket is closed and zeroed.

Failure

Function cannot fail; close errors are logged at error level but do not propagate.

Usage example (Cross-references)

Usage examples (Cross-references)
        }
        if (!SocketSetRecvTimeoutMs(sock.fd, timeout_ms)) {
            SocketClose(&sock);
            return -1;
        }
        i64 sent = SocketSend(&sock, query, qlen);
        if (sent != (i64)qlen) {
            SocketClose(&sock);
            return -1;
        }
        }
        i64 got = SocketRecv(&sock, resp_buf, resp_cap);
        SocketClose(&sock);
        return got;
    }
    }
    
    void SocketClose(Socket *self) {
        if (!self) {
            return;
        if (!SocketConnect(&upstream, SOCKET_KIND_TCP, upstream_addr)) {
            LOG_ERROR("failed to dial upstream for client [{}]", peer_str);
            SocketClose(client);
            StrDeinit(&peer_str);
            return;
        i64  first_n = SocketRecv(client, first, sizeof(first));
        if (first_n <= 0) {
            SocketClose(&upstream);
            SocketClose(client);
            StrDeinit(&peer_str);
        if (first_n <= 0) {
            SocketClose(&upstream);
            SocketClose(client);
            StrDeinit(&peer_str);
            return;
        proxy_pump(client, &upstream, first, (size)first_n);
    
        SocketClose(&upstream);
        SocketClose(client);
        StrDeinit(&peer_str);
    
        SocketClose(&upstream);
        SocketClose(client);
        StrDeinit(&peer_str);
    }
    
        if (!ListenerAccept(&listener, &server)) {
            SocketClose(&client);
            ListenerClose(&listener);
            DefaultAllocatorDeinit(&alloc);
        size n       = (size)ZstrLen(payload);
        if (SocketSend(&client, payload, n) != (i64)n) {
            SocketClose(&server);
            SocketClose(&client);
            ListenerClose(&listener);
        if (SocketSend(&client, payload, n) != (i64)n) {
            SocketClose(&server);
            SocketClose(&client);
            ListenerClose(&listener);
            DefaultAllocatorDeinit(&alloc);
        bool ok  = got == (i64)n && MemCompare(buf, payload, n) == 0;
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
    
        if (!ListenerAccept(&p.listener, &p.server)) {
            SocketClose(&p.client);
            ListenerClose(&p.listener);
            return p;
    
    static void pair_close(Pair *p) {
        SocketClose(&p->server);
        SocketClose(&p->client);
        ListenerClose(&p->listener);
    static void pair_close(Pair *p) {
        SocketClose(&p->server);
        SocketClose(&p->client);
        ListenerClose(&p->listener);
    }
    
        // Client closes; server side sees EOF -> POLLIN readable.
        SocketClose(&p.client);
    
        SocketPollItem item   = {0};
        bool ok = n == 1 && (item.events_ready & SOCKET_POLL_READ) != 0 && (item.events_ready & SOCKET_POLL_WRITE) == 0;
    
        SocketClose(&p.server);
        ListenerClose(&p.listener);
        DefaultAllocatorDeinit(&alloc);
        ok            = ok && server.kind == SOCKET_KIND_TCP;
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
    
        if (!ListenerAccept(listener, server)) {
            SocketClose(client);
            ListenerClose(listener);
            return false;
        ok      = ok && g2 == (i64)n2 && MemCompare(buf2, s2c, n2) == 0;
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
    
        // Client closes; server must observe EOF (recv == 0).
        SocketClose(&client);
    
        char buf[16];
        bool ok  = got == 0;
    
        SocketClose(&server);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
        StrDeinit(&rendered);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
        SocketRecv(&server, buf, sizeof(buf));
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
        ok       = ok && got == (i64)n && MemCompare(buf, payload, n) == 0;
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
        ok       = ok && got == (i64)n && MemCompare(buf, payload, n) == 0;
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
        ok       = ok && got == (i64)n && MemCompare(buf, payload, n) == 0;
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
    
        SocketClose(&server);
        SocketClose(&client);
        ListenerClose(&listener);
        DefaultAllocatorDeinit(&alloc);
Last updated on