Skip to content

Socket

Description

A connected socket: either returned by ListenerAccept (server side) or by SocketConnect (client side). peer is the remote endpoint.

Usage example (Cross-references)

Usage examples (Cross-references)
    
    #if FEATURE_SYS_SOCKET
    #    include <Misra/Sys/Socket.h>
    #endif
        SocketKind kind;
        SocketAddr peer;
    } Socket;
    
    typedef enum SocketPollFlags {
    /// TAGS: Socket, Listener, Accept
    ///
    bool ListenerAccept(Listener *self, Socket *out_conn);
    
    ///
    /// TAGS: Socket, Connect
    ///
    bool SocketConnect(Socket *out, SocketKind kind, const SocketAddr *target);
    
    ///
    /// TAGS: Socket, Recv
    ///
    i64 SocketRecv(Socket *self, void *buf, size n);
    
    ///
    /// TAGS: Socket, Send
    ///
    i64 SocketSend(Socket *self, const void *buf, size n);
    
    ///
    /// TAGS: Socket, Close
    ///
    void SocketClose(Socket *self);
    
    // --- Options ----------------------------------------------------------------
    #include <Misra/Std/Container/Str.h>
    #include <Misra/Std/Container/Vec.h>
    #include <Misra/Sys/Socket.h>
    #include <Misra/Types.h>
    #include <Misra/Std/Memory.h>
    #include <Misra/Std/Prng.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../_Syscall.h"
    // on success or -1 on failure.
    static i64 udp_round_trip(const SocketAddr *ns, const u8 *query, u64 qlen, u8 *resp_buf, u64 resp_cap, u32 timeout_ms) {
        Socket sock = {0};
        if (!SocketConnect(&sock, SOCKET_KIND_UDP, ns)) {
            return -1;
    #include <Misra/Config.h>
    
    #include <Misra/Sys/Socket.h>
    
    #include <Misra/Std.h>
    }
    
    bool ListenerAccept(Listener *self, Socket *out_conn) {
        if (!self || !out_conn) {
            LOG_FATAL("ListenerAccept: NULL argument");
    // ---------------------------------------------------------------------------
    
    bool SocketConnect(Socket *out, SocketKind kind, const SocketAddr *target) {
        if (!out || !target) {
            LOG_FATAL("SocketConnect: NULL argument");
    }
    
    i64 SocketRecv(Socket *self, void *buf, size n) {
        if (!self || !buf) {
            LOG_FATAL("SocketRecv: NULL argument");
    }
    
    i64 SocketSend(Socket *self, const void *buf, size n) {
        if (!self || !buf) {
            LOG_FATAL("SocketSend: NULL argument");
    }
    
    void SocketClose(Socket *self) {
        if (!self) {
            return;
    #include <Misra/Std/ArgParse.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    
    int main(int argc, char **argv) {
    #include <Misra/Std/ArgParse.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    
    #if PLATFORM_WINDOWS
    // directions close. `first_chunk` (if non-NULL) is sent toward `b`
    // before the poll loop runs, so the initial client read isn't lost.
    static void proxy_pump(Socket *a, Socket *b, Zstr first_chunk, size first_len) {
        if (first_chunk && first_len > 0) {
            if (SocketSend(b, first_chunk, first_len) < 0) {
    }
    
    static void handle_connection(Allocator *alloc, Socket *client, const SocketAddr *upstream_addr) {
        Str peer_str = SocketAddrFormat(&client->peer, alloc);
        Str peer_str = SocketAddrFormat(&client->peer, alloc);
    
        Socket upstream;
        if (!SocketConnect(&upstream, SOCKET_KIND_TCP, upstream_addr)) {
            LOG_ERROR("failed to dial upstream for client [{}]", peer_str);
                }
    
                Socket client;
                if (!ListenerAccept(&listener, &client)) {
                    continue;
    #include <Misra/Std/Zstr.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../Util/TestRunner.h"
    #include <Misra/Std/Log.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../Util/TestRunner.h"
    
    int main(void) {
        WriteFmt("[INFO] Starting Socket.Blind tests\n\n");
    
        TestFunction tests[] = {
        (void)deadend_tests;
    
        return run_test_suite(tests, sizeof(tests) / sizeof(tests[0]), deadend_tests, 0, "Socket.Blind");
    }
        (void)tests;
        (void)deadend_tests;
        return run_test_suite(tests, 0, deadend_tests, 0, "Socket.Mut");
    }
    #include <Misra/Std/Zstr.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    #include <Misra/Std/Utility/StrIter.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../Util/TestRunner.h"
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../Util/TestRunner.h"
    
        Listener listener;
        Socket   client = {0};
        Socket   server = {0};
        Listener listener;
        Socket   client = {0};
        Socket   server = {0};
    
        SocketAddr bind_addr;
    typedef struct Pair {
        Listener listener;
        Socket   client;
        Socket   server;
        bool     ok;
        Listener listener;
        Socket   client;
        Socket   server;
        bool     ok;
    } Pair;
        }
    
        Socket client = {0};
        if (!SocketConnect(&client, SOCKET_KIND_TCP, &connect_addr)) {
            ListenerClose(&listener);
        }
    
        Socket server = {0};
        bool   ok     = ListenerAccept(&listener, &server);
        ok            = ok && server.kind == SOCKET_KIND_TCP;
    // 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};
    // ---------------------------------------------------------------------------
    static bool sk4_make_pair(Allocator *a, Listener *listener, Socket *client, Socket *server, SocketAddr *local_out) {
        *client = (Socket) {0};
        *server = (Socket) {0};
    static bool sk4_make_pair(Allocator *a, Listener *listener, Socket *client, Socket *server, SocketAddr *local_out) {
        *client = (Socket) {0};
        *server = (Socket) {0};
    
        SocketAddr bind_addr;
    
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
            DefaultAllocatorDeinit(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
            DefaultAllocatorDeinit(&alloc);
    
        Listener   listener;
        Socket     client;
        Socket     server;
        SocketAddr local;
        Listener   listener;
        Socket     client;
        Socket     server;
        SocketAddr local;
        if (!sk4_make_pair(a, &listener, &client, &server, &local)) {
    
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
            DefaultAllocatorDeinit(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
            DefaultAllocatorDeinit(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
            DefaultAllocatorDeinit(&alloc);
    
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
        Listener listener;
        Socket   client;
        Socket   server;
        if (!sk4_make_pair(a, &listener, &client, &server, NULL)) {
            DefaultAllocatorDeinit(&alloc);
    
    int main(void) {
        WriteFmt("[INFO] Starting Socket tests\n\n");
    
        TestFunction tests[] = {
            deadend_tests,
            sizeof(deadend_tests) / sizeof(deadend_tests[0]),
            "Socket"
        );
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../Util/TestRunner.h"
    #include <Misra/Std/Zstr.h>
    #include <Misra/Sys/Dns.h>
    #include <Misra/Sys/Socket.h>
    
    #include "../Util/TestRunner.h"
Last updated on