C или C ++ с LibEvent / Libev: контролировать сокет Unix

StackOverflow https://stackoverflow.com/questions/9031377

  •  14-11-2019
  •  | 
  •  

Вопрос

Я пытаюсь отслеживать сокет Unix ("/ tmp / mysocket").

Я могу сделать это хорошо в Node.js: он поднимает событие, когда 1) сокет связан, 2) Кто-то подключается к сокете 3) Данные отправляются на сокет и 4) сокет отключен. .

Я пытаюсь сейчас сделать это в C / C ++: я хочу отслеживать «/ TMP / mysocket» для вышеуказанных событий.Я посмотрел на LibEvent (который бы я желал использовать), но считаю, что он требует IP-порта.Есть ли способ отслеживать сокеты Unix?

Или кто-нибудь может предложить другое решение C / C ++?

Это было полезно?

Решение

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top