2

UNIXソケット( "/ tmp / mysocket")を監視しようとしています。

Node.jsでこれをうまく行うことができます:1)ソケットがバインドされている、2)誰かがソケットに接続している、3)データがソケットに送信されている、4)ソケットが切断されているときにイベントが発生します。

これをC/C++で実行しようとしています。上記のイベントについて「/tmp/mysocket」を監視したいと思います。libevent(できれば使用したい)を見てきましたが、IP:portが必要であることがわかりました。UNIXソケットを監視する方法はありますか?

または、誰かが別のC / C ++ソリューションを提案できますか?

4

1 に答える 1

5

UNIXドメインソケットは、たとえば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も同様である必要があります。

于 2012-01-27T10:06:39.310 に答える