问题标签 [libev]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
915 浏览

data-structures - libev watchers的数据结构

Libev使用三种数据结构来存储不同的观察者。

堆:用于按时间排序的观察者,例如ev_timerev_periodic

链表:ev_io, ev_signal,ev_child等。

数组:ev_prepareev_checkev_async

毫无疑问,使用堆来存储计时器观察者。但是选择链表和数组的标准是什么?

存储 ev_io 观察者的数据结构似乎有点复杂。它首先是一个以fd索引为索引的数组,数组中的元素是 的链表ev_io watcher。如果使用链表作为元素,则为数组分配空间更方便。是这个原因吗?

或者只是因为插入或删除操作ev_io更频繁,ev_prepare看起来更稳定?

还是有什么其他原因?

0 投票
3 回答
1713 浏览

openssl - OpenSSL 使用带有非阻塞套接字的 libev 读取客户端证书错误

我花了一些时间搜索互联网寻找更好的方法来分析和调试我的问题,但我似乎找不到解决方案。所以我想我会问。

简要地。我正在尝试创建一个非阻塞 ssl 转发代理。代理的服务器部分使用的是自签名服务器证书,我使用自己的 CA 证书进行了签名。如果重要的话,我正在使用 libev。我首先成功地创建了一个非加密代理(它盲目地转发了网络流量),现在我正在尝试向它添加 SSL。:)

我在让客户端连接到代理时遇到问题。我已经尝试过 wget 和 ssl 的 s_client 作为测试客户端,因为我想进行一些自动化测试。

ssl 服务器设置(此代码在 EV_READ 事件上从 libev 观察程序侦听套接字 accept_handler() 调用):

libev 循环设置为:

我有计时器等来检查关闭标志以及其他家务活动。

我的 client_handshake() 主函数基本上看起来像这样:

在 client_info_cb() 中,我打印出内部 SSL 状态,并从我的 print() 函数中获得以下信息:

这就是它挂起的地方。如果我检测到 SSL_ERROR_WANT_READ(这是 SSL_get_error() 在上面的第二个“读取客户端证书 A”消息之后返回的内容),我尝试将 client_handshake() 函数修改为在 SSL_accept() 周围循环(1){}。

那什么也没做,只是让我进入一个无限循环(),不断调用 SSL_accept()。

我假设 SSL 状态机需要一些它无法获得的附加信息。起初我以为我需要继续从套接字读取,但这没有用。

另外,我对为什么我的代理尝试读取客户端证书感到困惑,因为我已明确指定我不想验证上面的客户端证书 (SSL_VERIFY_NONE);除非我误解了该功能的目的。

如果有人对此有任何见解,我将不胜感激。或者也许是调试此问题的更好方法。strace() 对此毫无用处,而且我从 wget 或 s_client 都没有得到任何好的返回/错误消息。

我尝试在 SSL 的状态机中设置 alert_callbacks 和 msg_callbacks,但这并没有给我提供比 info 回调更多的信息。

在这一点上,我不确定这是套接字问题,还是 SSL 问题,或者什么。

edit1:我想指出,在accept_handler() 中,我首先通过ssl 连接到服务器,以便在完成accept() 之前验证我正在代理的主机的证书。如果我颠倒操作顺序,并在connect()之前先接受(),它就可以工作。

edit2:我尝试查看 s_client 和代理之间的 tcpdump 输出。在client_info_cb中引用的写入服务器数据和flush数据后,客户端发送“Client Key Exchange”、“Change Cipher Spec”和“Encrypted Finished Message”。但是 ssl 状态机正在寻找客户端证书???

0 投票
2 回答
927 浏览

events - epoll/libevent/libev 可以和 UDT 一起工作吗?

我正在构建一个需要处理数万个活动套接字的高并发服务器。我最初使用 epoll 来构建一个基于事件的服务器,它在中等规模(数千个活动套接字)下运行良好。但是当我的并发超过 10,000 个套接字时,它似乎变得不稳定。所以我正在考虑 libevent(或 libev),因为它是一个成熟的项目,并声称能够“处理数万个活动套接字”。

我也在考虑使用 UDT,因为它是一个“可靠的 UDP”,并且由于开销和内存使用,我开始遇到 TCP 问题。所以一个很自然的想法是使用 libevent 作为我的事件框架工作,使用 UDT 作为传输协议。我知道 UDT 提供了自己的一组 epoll 操作。这是否意味着它不能与常规的 linux epoll 一起使用?如果是这样,它将无法与 libevent 或 libev 一起使用,因为它们是基于 Linux epoll 构建的。

有没有人在 UDT 和 epoll / libevent / libev 上工作过?UDT 可以与它​​们中的任何一个一起使用吗?

任何帮助将不胜感激。谢谢。

0 投票
1 回答
924 浏览

c - 编译时出现Libev错误

我正在尝试使用 gcc -g -Wall -Wextra -DNDEBUG -pedantic -ansi 标志编译代码并使用 libev 库。我在eclipse中收到以下错误:

我已经在 ubuntu 中安装了 libev-dev 包。

0 投票
1 回答
317 浏览

c# - 在 C 中引发和处理事件

我正在将一些 C# 代码(主要是类)移植到 C。我已经分析了代码,并且移植绝对是可能的。我不确定的一件事是如何在 C 中处理(即实现)引发事件。

我在 Linux 环境中,我希望二进制文件只能在 Linux 上运行。我听说 GLib 支持事件,但对此知之甚少 - 任何帮助将不胜感激。

一个引发事件并在 C 中处理它的 hello world 示例将非常有用。

0 投票
1 回答
1586 浏览

c++ - libev 将套接字设置为无超时阻塞

Rant:我真的不喜欢 boost::asio,所以我一直在寻找替代方案并遇到了 libev。这对我来说似乎很简单,但正在做一些我无法理解的事情。如果一个线程中有太多问题,请告诉我。

1)我将监听套接字设置为 NON_BLOCK,我还将每个接受的传入连接设置为 NON_BLOCK,但在代码中的某处套接字变成了 BLOCK。前任:

我试图让主循环也不会阻塞:

但这似乎并没有带来什么不同。请不要将我重定向到我已阅读的文档(互联网上唯一可用的文档来源)。

我为已接受的客户端套接字执行此操作:

然而,每次执行我的读取回调时,套接字都会神奇地设置为 BLOCK

2)我尝试为套接字设置超时:struct timeval timeout;

(取自这里:this question)它根本行不通。这是因为套接字被重置为阻塞模式吗?

3) 我看到了 libev 的 C++ 包装器。我绝对讨厌我必须使回调静态函数这一事实,它毁了我的一切。然而,我看到的所有示例都使用:

有趣的是,这会产生:

错误:“struct ev::loop_ref”没有名为“break_loop”的成员错误:“struct ev::default_loop”没有名为“run”的成员</p>

关于 Debian 挤压。

所以,我要问的是:

  1. 什么,谁,在哪里将套接字从 NON_BLOCK 更改为 BLOCK ?
  2. 我如何(如果)为套接字设置超时(阻塞或非阻塞)
  3. ev++.h 有什么问题,为什么那些好人使用我不能使用的包装器?

请记住,我可以使用套接字读取和发送数据,但是以阻塞方式,没有超时。此外,由于这是一个服务器,我需要将代码保存在类中,因为我必须为每个连接的客户端保存消息。制作这种静态或非类方法只会破坏它,或者迫使我采取一种非常不同的方法。

PS: libev 的任何替代品?

0 投票
1 回答
3992 浏览

c - c libev 未定义对 `ev_default_loop' 的引用

我在 ubuntu 上运行 gcc 编译器我正在使用一个示例来学习如何与 libev 建立套接字连接我安装了 libev4 和 libev-dev,但是一切正常,除非我添加 struct ev_loop *loop = ev_default_loop(0); 它引发了一个未定义的参考错误,谁能告诉我这里有什么问题是我的代码

我收到了多个错误,我已经标记了任何人都可以告诉我出了什么问题我做了很多搜索但没有找到任何东西。

0 投票
1 回答
102 浏览

sockets - 在孩子中接收事件

我正在使用 libev 编写 tcp 服务器。我在listen()之后创建套接字并分叉,然后在监听套接字上启动一个libev读取观察器并在观察器回调中接收客户端连接。可能是这样的情况,当两个孩子和父母(或者两个孩子,如果有多个)收到监听套接字变得可读的事件并且两者都将尝试接受()客户端连接,在这种情况下,其中一个进程将阻塞?我编写了测试程序,似乎只有一个进程接收到 read-ready 事件,但也许我错了?在这种情况下,我可以在哪里阅读有关系统行为的信息?内核如何在进程之间进行负载平衡并决定谁将接收事件?它是后端(选择、epoll 等)和/或特定于操作系统的吗?

0 投票
2 回答
829 浏览

c - 从此示例代码中获取 libev 远程 IP 地址?

我正在尝试从以下链接学习 libevent/libev(在本例中为 libev):http: //www.ibm.com/developerworks/aix/library/au-libev/

我想知道如何找出远程 IP 地址是什么,以便我可以构建自己的 DHT。

我猜它与传入的结构有关,但我只是不知道。

这是使用传入变量的回调代码,其余代码请单击上面的链接。

基本上,示例代码提供了一个由 libev 事件驱动的“服务器”,您可以通过远程登录服务器 ip:port 对连接到服务器,它只会回显您对它说的所有内容——请注意“您说 % s\n"

0 投票
1 回答
384 浏览

c - 为什么 evbuffer_add_printf 只接受静态变量而不接受“动态”变量?

到目前为止,我已经让我的libev代码成功返回了一个静态字符串,上面写着“OMP OMP”,但是当我编写一个返回“静态”字符串的函数时,它似乎永远不会工作。(旁注:这个想法是将相同的功能变成动态响应,但仅出于敏捷测试的目的,我需要首先使用它)。我的libev读取回调代码如下...

parse_json_command函数如下...

如果您想查看完整的代码(在撰写本文时只有几页大),您可以通过以下链接访问源代码:https ://github.com/Xenland/P2PCrypt-Server

感谢您的时间和帮助!