Skip to content
SocketAddrParse

SocketAddrParse

Description

Parse a host:port string into a SocketAddr.

Accepted forms: “127.0.0.1:8080” “[::1]:8080” “example.com:80” (DNS resolved via libc getaddrinfo)

Parameters

Name Direction Description
out out Result address. Left zeroed on failure.
spec in Host:port specifier.
kind in SOCKET_KIND_TCP or SOCKET_KIND_UDP. Influences which protocol getaddrinfo is asked for.

Success

returns true; out populated.

Failure

returns false; logs the resolver error; out zeroed.

Usage example (Cross-references)

Usage examples (Cross-references)
    
        SocketAddr bind_addr;
        if (!SocketAddrParse(&bind_addr, "127.0.0.1:0", SOCKET_KIND_TCP)) {
            return false;
        }
        snprintf(spec, sizeof(spec), "127.0.0.1:%u", (unsigned)port);
        SocketAddr connect_addr;
        if (!SocketAddrParse(&connect_addr, spec, SOCKET_KIND_TCP)) {
            ListenerClose(&listener);
            return false;
        {
            SocketAddr addr;
            if (!SocketAddrParse(&addr, "127.0.0.1:8080", SOCKET_KIND_TCP)) {
                DefaultAllocatorDeinit(&alloc);
                return false;
        {
            SocketAddr addr;
            if (!SocketAddrParse(&addr, "[::1]:8080", SOCKET_KIND_TCP)) {
                DefaultAllocatorDeinit(&alloc);
                return false;
    // ---------------------------------------------------------------------------
    
    bool SocketAddrParse(SocketAddr *out, const char *spec, SocketKind kind) {
        if (!out) {
            LOG_ERROR("SocketAddrParse: out is NULL");
    bool SocketAddrParse(SocketAddr *out, const char *spec, SocketKind kind) {
        if (!out) {
            LOG_ERROR("SocketAddrParse: out is NULL");
            return false;
        }
    
        if (!spec) {
            LOG_ERROR("SocketAddrParse: spec is NULL");
            return false;
        }
        const char *port = NULL;
        if (!split_host_port(spec, host, sizeof(host), &port)) {
            LOG_ERROR("SocketAddrParse: cannot split host:port in \"{}\"", spec);
            return false;
        }
        i32              gairet = getaddrinfo(host, port, &hints, &res);
        if (gairet != 0) {
            LOG_ERROR("SocketAddrParse: getaddrinfo(\"{}\") failed: {}", spec, gai_strerror(gairet));
            return false;
        }
        }
        if (!res) {
            LOG_ERROR("SocketAddrParse: getaddrinfo(\"{}\") returned no results", spec);
            return false;
        }
    
            SocketAddr listen_addr;
            if (!SocketAddrParse(&listen_addr, listen_spec, SOCKET_KIND_TCP)) {
                LOG_ERROR("invalid --listen address: {}", listen_spec);
                LogDeinit();
    
            SocketAddr upstream_addr;
            if (!SocketAddrParse(&upstream_addr, upstream_spec, SOCKET_KIND_TCP)) {
                LOG_ERROR("invalid --upstream address: {}", upstream_spec);
                LogDeinit();
Last updated on