c++clibeventlibev

C or C++ with libevent/libev: monitor a unix socket


I'm trying to monitor a unix socket ("/tmp/mysocket").

I can do this fine in Node.js: it raises an event when

  1. a socket is bound
  2. someone connects to the socket
  3. data is sent to the socket and
  4. the socket is disconnected.

I'm trying to now do this in C/C++: I want to monitor "/tmp/mysocket" for the above events. I've looked at libevent (which I'd preferably like to use), but see that it requires an IP:port. Is there any way to monitor unix sockets?

Or can anyone suggest another C/C++ solution?


Solution

  • You could monitor a UNIX domain socket just like a regular file, since it can be operated like a file, e.g. in libev,

    struct sockaddr_un address;
    memset(&address, 0, sizeof(address));
    address.sun_family = AF_LOCAL;
    strcpy(address.sun_path, "/tmp/mysocket");
    
    bind(socket, (struct sockaddr*)(&address), sizeof(address));
    listen(socket, 5);
    
    // now listen if someone has connected to the socket.
    // we use 'ev_io' since the 'socket' can be treated as a file descriptor.
    struct ev_io* io = malloc(sizeof(ev_io));
    ev_io_init(io, accept_cb, socket, EV_READ);
    ev_io_start(loop, io);
    ...
    
    void accept_cb(struct ev_loop* loop, struct ev_io* io, int r)
    {
        // someone has connected. we accept the child.
        struct sockaddr_un client_address;
        socklen_t client_address_len = sizeof(client_address);
        int client_fd = accept(socket, (sockaddr*)(&client_address),
                               &client_address_len);
    
        // 'read' / 'recv' from client_fd here.
        // or use another 'ev_io' for async read.
    }
    

    libevent should be similar.