问题标签 [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 投票
1 回答
657 浏览

c++ - libev + 非阻塞套接字不断调用回调

我正在使用 libev + 非阻塞套接字向服务器发送请求。我正在使用 Keep Alive,因为我需要通过同一连接将未来的请求发送到目的地。

行为 运行程序,它会按预期获取 URL 和日志到控制台。完成此操作后,等待并且不要按 ctrl+c 退出程序。

预期 的应用程序应保持打开状态,因为事件循环正在等待未来的响应,但不应在初始响应后控制台记录任何内容。

实际 让应用程序运行。30 多秒后,它将开始一次又一次地控制台记录相同的响应而没有结束。

问题 为什么 libev 在没有发送新请求且没有收到新响应数据时反复调用我的回调(example_cb)?我怎样才能解决这个问题?

编辑:根据评论的建议更新代码

0 投票
0 回答
993 浏览

c - 你如何接受与 libwebsockets 的 websocket 连接?

在 warmcat/libwebsockets 上找到的所有示例都是关于接受 http 请求和提供网页/文件的。我正在尝试进行 websocket 连接,例如:ws://123.0.0.1/blah但是它永远不会正确建立连接。

我正在curl尝试与我的 websocket 服务器通信:

在我的服务器上,我没有做任何特别的事情,只是试图打印出流程。

在我的main()中,我跑去libev投票:

更新

我也尝试过curl像这样的不同命令:

我看到了这个:

这是预期的行为吗?

0 投票
1 回答
261 浏览

c - 使用 libev 时的串口 ttyUSB0 读取块

我有一个串口ttyUSB0,用NONBLOCK打开它。

fd = open(args_info.dev_arg, O_RDWR | O_NONBLOCK);

使用read将立即返回,一切正常。但是当使用 libev

ev_io_init(&serial->recv_ctx->io, serial_recv_cb, fd, EV_READ);

serial_recv_cb将阻塞直到 100 字节。如果数据长度小于 100 字节,serial_recv_cb则永远不会被调用。

我认为serial_recv_cb将被称为即时。为什么libev会阻塞?

0 投票
2 回答
181 浏览

c - 为什么有人会为第一个参数定义宏,包括 C 中的逗号?

ev.hlibev 内部,我发现了一些看起来很奇怪无法理解的宏:

作者将宏定义EV_P_EV_P,并将其用作函数定义中的第一个参数,如下所示:

很好奇为什么不直接写EV_P,而不是EV_P_,所以函数参数用逗号看起来会更清楚:

这是C中的一个技巧还是有其他原因?不熟悉C,之前google了一下,还是没有答案。

0 投票
1 回答
581 浏览

linux - 如何读取附加到(又名,如tail -f)的文件的[非阻塞]文件描述符?

实际上,我正在使用 libev;但在幕后,这是使用 epoll (我只在 linux 上)。当我添加一个观察者来读取文件并且所有数据都已读取时,我确实会收到一个回调,表明有数据要读取,但 read(2) 返回 0 (EOF)。那时我必须停止观察者,否则它会继续告诉我有东西要读。但是,如果我停止观察程序,然后其他一些进程将数据附加到该文件,那么我将永远看不到它。

在我已经阅读到最后之前,获得通知文件中可以读取的附加/附加数​​据的正确方法是什么?

我更喜欢关于 libev 的答案,但较低级别也可以(然后我可以将其转换为如何使用 libev 来做到这一点)。

0 投票
1 回答
595 浏览

redis - 带有libev和pthread的异步hiredis,我做错了什么?

我正在为一个小型单色显示器编写一个 GUI,我想每秒更新一次屏幕上的数据。

数据存储在 redis 数据库中,我正在尝试使用 pthread、libev 和异步hiredis 调用进行协调。

我的计划是有一个线程每秒从数据库中提取新数据并存储一个本地副本以便快速访问。

另一个更新屏幕的线程将随意访问该数据,而无需等待数据库访问。

第一个问题,我的方法正确吗?

第二个问题,为什么我无法每秒轮询数据库?我想我可以切换到同步方法并让它工作,但这是正确的方法吗?

以下是相关代码:

在下文中,如果我ev_loop(EV_DEFAULT_ 0);在 redisAsync 命令之后移动到 while 循环内,我的回调将在第一个循环中被调用,但再也不会调用。它的坐姿,我的回调永远不会被调用。

0 投票
1 回答
628 浏览

c++ - AMQP-CPP,libev > 从另一个线程停止 ev_loop

我使用带有后端的 AMQP-CPP库。libev我尝试创建一个将打开连接并进行消费的类。我想在工作线程中运行连接的循环,以免阻塞主线程。那部分代码看起来像这样

然后在某个时候我想停止循环。我读过可以用ev_break()函数来做到这一点。但是,它应该从与被调用的线程相同的线程ev_run()中调用。更多搜索表明该ev_async_send()功能可能会这样做,但我不知道如何。

我该怎么做?有任何想法吗?

0 投票
1 回答
454 浏览

libev - 将 open62541 集成到现有的 libev 事件循环中

我有一个现有的应用程序,它广泛使用 libev 的事件循环。我现在想添加 OPC UA 服务器功能,但不确定如何最好地将 open62541 事件循环集成到 libev 中。

想到以下可能性:

  1. UA_Server_run_iterate从时间为 0 的 libev 事件循环中调用。waitInternal这意味着服务器永远不会休眠(在 中轮询 open62541 ev_idle),或者来自 OPC UA 客户端的请求将经历高达 50 毫秒的额外延迟(默认open62541 的最大等待时间)。
  2. 修补 open62541 以允许服务器网络层检索当前正在使用的文件描述符(serverSockets 和连接)。这将允许为这些文件描述符添加 libev 事件,而这些事件又可以UA_Server_run_iterate仅在必要时轮询。
  3. 实现一个使用 libev 的自定义服务器网络层。这似乎意味着相当多的代码重复......是否有任何示例/教程用于实现自定义网络层?
  4. 在单独的线程中运行 open62541 事件循环。我真的真的很想避免这种情况,因为像 libev 这样的事件系统的全部目的是避免与异步操作相关的问题。例如,来自 open62541 的所有回调都必须与主 libev 线程同步。

就复杂性和性能而言,您认为上述哪个选项“最好”?

您能想到上面未列出的任何其他选项吗?


也张贴在 open62541 邮件列表上。

0 投票
1 回答
192 浏览

mingw - Building libevhtp using Mingw

I am building libevhtp on windows using mingw,I have generated Makefileusing cmake and mingw. I am getting error while calling "make"-

This is the log.c which is giving error. I have checked mingw and doesn't contain arpa/inet.h and installer doesn't provide any library which gives arpa/inet.h.

any help would be appreciated. this is the github link of libevhtp-https://github.com/criticalstack/libevhtp

0 投票
1 回答
268 浏览

c++ - 我将如何使用在 C++ 对象中扩展 libev 的库?

我正在尝试为一个名为 libumqtt 的库实现一个包装器。Libumqtt是一个 C 库,它使用 libev 对来自 MQTT 协议的事件进行回调。

直到前几天我才意识到我无法将成员函数传递给需要正常静态函数的函数。这会导致问题,因为我计划启动多个 libumqtt 实例以同时处理多个连接。

我的代码在 C++ 中,因为这是与 Godot 的(游戏引擎)GDNative 模块一起使用最方便的。

在研究一种将 ac 库的多个实例沙箱化或以某种方式使指针正常工作的方法时,我找到了这个答案。我不明白答案中的这句话:

如果您需要访问类的任何非静态成员并且需要使用函数指针,例如,因为该函数是 C 接口的一部分,那么您最好的选择是始终将 void* 传递给采用函数指针的函数并通过转发函数调用您的成员,该函数从 void* 获取对象,然后调用成员函数。

我想要做的是设置回调,当它同时处理可能多达 500 个或更多连接时,libev 将使用该回调将数据发送到我的对象的正确实例。

通过 void* 会帮助我实现我的目标吗?我将如何实现它?另外,转发功能如何工作?

编辑:提供核桃要求的代码示例

下面的这个例子来自我使用静态函数的类的一个版本。如果我尝试在函数不是静态的情况下使用 run this,那么我会收到一个错误,即无法传入成员函数来代替常规函数。

编辑:我应该提到我是使用 C 和 C++ 的菜鸟。我之前做的最多的是测试缓冲区溢出。因此,如果我显然做错了什么,我将不胜感激评论中的提示。