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)
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Sys/Socket.h>
    
    #include <arpa/inet.h>
    bool test_socket_loopback_round_trip(void) {
        Listener listener;
        Socket   client = {0};
        Socket   server = {0};
        Listener listener;
        Socket   client = {0};
        Socket   server = {0};
    
        SocketAddr bind_addr;
    
    int main(void) {
        WriteFmt("[INFO] Starting Socket tests\n\n");
    
        TestFunction tests[] = {
        };
    
        return run_test_suite(tests, sizeof(tests) / sizeof(tests[0]), NULL, 0, "Socket");
    }
    #define _POSIX_C_SOURCE 200809L
    
    #include <Misra/Sys/Socket.h>
    
    #ifdef _WIN32
    
    #ifdef _WIN32
    #    error "Sys/Socket on Windows is not implemented yet; set sys_socket=false"
    #endif
    }
    
    bool ListenerAccept(Listener *self, Socket *out_conn) {
        if (!self || !out_conn) {
            LOG_ERROR("ListenerAccept: NULL argument");
    // ---------------------------------------------------------------------------
    
    bool SocketConnect(Socket *out, SocketKind kind, const SocketAddr *target) {
        if (!out || !target) {
            LOG_ERROR("SocketConnect: NULL argument");
    }
    
    i64 SocketRecv(Socket *self, void *buf, size n) {
        if (!self || !buf) {
            LOG_ERROR("SocketRecv: NULL argument");
    }
    
    i64 SocketSend(Socket *self, const void *buf, size n) {
        if (!self || !buf) {
            LOG_ERROR("SocketSend: NULL argument");
    }
    
    void SocketClose(Socket *self) {
        if (!self) {
            return;
    
    #if MISRA_HAVE_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.h>
    #include <Misra/Parsers/Http.h>
    #include <Misra/Sys/Socket.h>
    
    #include <signal.h>
    // 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, const char *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;
Last updated on