带有 libevent/libev 的 C 或 C++:监视 unix 套接字

Posted

技术标签:

【中文标题】带有 libevent/libev 的 C 或 C++:监视 unix 套接字【英文标题】:C or C++ with libevent/libev: monitor a unix socket 【发布时间】:2012-01-27 09:40:51 【问题描述】:

我正在尝试监视一个 unix 套接字(“/tmp/mysocket”)。

我可以在 Node.js 中很好地做到这一点:当 1) 绑定套接字、2) 有人连接到套接字、3) 将数据发送到套接字以及 4) 套接字断开连接时,它会引发一个事件。

我现在正尝试在 C/C++ 中执行此操作:我想监视“/tmp/mysocket”的上述事件。我查看了 libevent(我更喜欢使用它),但看到它需要一个 IP:端口。有什么方法可以监控 unix 套接字吗?

或者任何人都可以提出其他 C/C++ 解决方案吗?

【问题讨论】:

【参考方案1】:

您可以像监视常规文件一样监视 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 应该类似。

【讨论】:

您好,非常感谢您提供的信息。确实非常有用。我将尝试编译它。我对 libev 和/或 libevent 非常陌生,需要花点力气来填充您的代码并使其正常工作! 嗨 KennyTM - eve_io_init(...) 的第三个参数“socket”是什么类型? @Eamorr:int。请检查文档。 pod.tst.eu/http://cvs.schmorp.de/libev/… 感谢您的提示。我无法理解这一点......请记住,我对 libev 很陌生。 Libevent 确实也可以监控 unix 套接字。 (我不确定文档的哪一部分似乎说它需要 IP/端口。)

以上是关于带有 libevent/libev 的 C 或 C++:监视 unix 套接字的主要内容,如果未能解决你的问题,请参考以下文章

libuv源码分析前言

C语言学习方法学习平台及项目推荐

简单对比 Libeventlibevlibuv

简单对比 Libeventlibevlibuv

TCP网络编程杂谈

网络库libeventlibevlibuv对比